c++ 转换模板化非类型模板参数的构造函数

jc3wubiy  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(104)

当将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>>; }());
      |              ~~~~~^~~~~~~~~~~~~~~~~~~

bxgwgixi

bxgwgixi1#

根据评论,你的理解是正确的,这绝对是一个GCC bug。严格地说,这个问题的答案是,C++20不幸地说了很少关于模板参数对象是如何初始化的。一个defect report刚刚被批准;直到那个链接工作,previous version才可用。

相关问题