提问人:303 提问时间:11/17/2023 更新时间:11/18/2023 访问量:101
模板化非类型模板参数的转换构造函数
Converting constructor of templated non-type template parameter
问:
当将类型扔进 时,我希望通过使用 的转换构造函数来创建。但是,出于某种原因,GCC 似乎在 .C++20 标准对非类型模板参数的此类构造或推导有何规定?T::v
int
t<>
N
n
i
c<int, 3>::v
#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>>; }());
来自 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>>; }());
| ~~~~~^~~~~~~~~~~~~~~~~~~
答:
评论
int
n
constexpr int
int
t<3>
auto...
auto
n