当将int
类型的T::v
抛出到t<>
中时,我希望通过使用n
的转换构造函数来创建N
。然而,出于某种原因,GCC似乎在c<int, 3>::v
中查找成员i
。C++20标准对这种类型的构造或非类型模板参数的推导有什么规定?
#include <concepts>
template<auto...>
struct n {
constexpr n(int x): i{x} {}
int i;
};
template<typename T, T V>
struct c { static constexpr T v = V; };
template<n N>
using t = c<decltype(N.i), N.i>;
// clang ok, gcc nope, msvc ok
static_assert([]<typename T = t<3>>
{ return std::same_as<T, t<T::v>>; }());
字符串
Live example
来自GCC的错误消息:
<source>: In instantiation of '<lambda()> [with T = c<int, 3>]':
<source>:15:41: required from here
<source>:15:19: error: request for member 'i' in 'c<int, 3>::v', which is of
non-class type 'const int'
15 | { return std::same_as<T, t<T::v>>; }());
| ~~~~~^~~~~~~~~~~~~~~~~~~
型
1条答案
按热度按时间bxgwgixi1#
根据评论,你的理解是正确的,这绝对是一个GCC bug。严格地说,这个问题的答案是,C++20不幸地说了很少关于模板参数对象是如何初始化的。一个defect report刚刚被批准;直到那个链接工作,previous version才可用。