繁体   English   中英

使用指向数据成员的指针作为非类型模板参数

[英]Using a pointer to data member as a non-type template argument

我想知道防止指向数据成员的指针用作非类型模板参数的基本原理,如[temp.arg.nontype]中所述:

[注意:数组元素或非静态数据成员的地址不是可接受的模板参数。 [片段] —尾注]

此外,cppreference.com 说,指向数据成员的指针可以用作非类型模板参数,但是必须将它们表示为&Class::member 以下代码(在Clang和GCC上都选中了)似乎可以证实这一点:

#include <type_traits>
struct Foo { int bar; };
using X = std::integral_constant<int Foo::*, &Foo::bar>; // works
using Y = std::integral_constant<int Foo::*, X::value>; // fails

因此,我想知道在这一点上我是否错过了standard或cppreference.com中的某些内容是错误的。 如果cppreference.com是正确的,是否有任何理由允许&Foo::bar但不允许X::value

我正在使用C ++ 14工作草案

我想知道防止将指向数据成员的指针用作非类型模板参数的理由[...]

我不相信这是那样。

[注:一个数组元素或非静态数据成员的地址是不是可接受的模板的参数。 [片段] —尾注]

现在,也许我正在阅读本注释的措辞,但是我看到了地址 (即&s.s -> int* )和指向成员的指针(即&S::s -> int S::* -> int*之间的区别。 &S::s -> int S::* -> int* ),这允许的。

如果您扩展该[snip]您将看到该注释已经回答了部分问题:

X<&s.s> x5;  // error: &S::s must be used
X<&S::s> x6; // OK: address of static member

因此,cppreference并没有错。

在我看来,当前的gcc接受了它,clang也接受了,因为http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4198.html都已实现。 当然,如果您使用它们的C ++ 17模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM