簡體   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