Evg*_*Evg 7 c++ templates c++17
在27:35的视频中,Bryce Lelbach给出了以下示例:
template<auto... Dims>
struct dimensions {};
struct dynamic_extent {};
constexpr dynamic_extent dyn = {};
dimensions<64, dyn, 32> d;
此代码无法编译.海湾合作委员会抱怨:
<source>:8:27: error: 'struct dynamic_extent' is not a valid type for a template non-type parameter
     dimensions<64, dyn, 32> d;
                           ^
Clang抱怨说:
<source>:8:20: error: a non-type template parameter cannot have type 'dynamic_extent'
    dimensions<64, dyn, 32> d;
                   ^
<source>:2:22: note: template parameter is declared here
    template<auto... Dims>
                     ^
他的例子是完全错的(这很奇怪,因为他指的是使用这个想法的图书馆)或者我没有得到什么?
是的,他的榜样是错的.
非类型模板参数在P0732之前不能具有类类型,这是一个C++ 20特性.即使在C++ 20中,这仍然是格式不正确的,因为为了选择使用dyn非类型模板参数,您需要:
struct dynamic_extent {
    auto operator<=>(dynamic_extent ) = default;
};
那时,它会起作用.
我认为他的意思是:
dimensions<64, &dyn, 32> d;
//             ^^^^
传递指针很好 - 指针是C++ 17中可接受的非类型模板参数(以及之前的方式),只要它们满足一些其他要求 - 这样dyn做.
那个例子是错的.这在C++ 17中不起作用.非类型模板参数必须是以下之一:
std::nullptr_t- 积分型
- 左值引用类型(对象或函数)
- 指针类型(对象或函数)
- 指向成员类型的指针(指向成员对象或成员函数)
- 枚举类型
任意类类型不在此列表中.
请注意,使用枚举作为标记类型会起作用:
template<auto... Dims>
struct dimensions {};
enum class dynamic_extent {};
constexpr dynamic_extent dyn = {};
dimensions<64, dyn, 32> d;