[英]invalid initialization of non-const reference of type ‘std::string&
[英]Non type template parameter of type std::string& compiles in gcc but not in clang
我正在使用此處列出的書籍學習 C++。 特別是,我了解到我們不能使用std::string
作為非類型模板參數。 現在,為了進一步明確我對主題的概念,我嘗試了以下示例,該示例在 gcc 和 msvc 中編譯,但不在 clang 中。 演示
std::string nameOk[] = {"name1", "name2"};
template<std::string &name>
void foo()
{
}
int main()
{
foo<nameOk[0]>(); //this compiles in gcc and msvc but not in clang in C++20
}
我的問題是哪個編譯器就在這里(如果有的話)。 也就是說,程序是格式良好的還是 IFNDR。
Clang 抱怨您的模板參數是子對象。 (如果您將參數設為完整的字符串 object,它會起作用。)
此行為基於 [temp.arg.nontype] 標准中較早的限制,其內容為
對於引用或指針類型的非類型模板參數,常量表達式的值不應引用(或對於指針類型,不應是地址):
- 一個子對象(6.7.2 [intro.object]),
自 C++20 中的P1907起,此限制已解除,但 Clang 尚未反映這一點。 當您將版本 10 與 C++17 一起使用時,GCC 也會失敗:
error: '& nameOk[0]' is not a valid template argument of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} because 'nameOk[0]' is not a variable
Clang 拒絕代碼是錯誤的,因為這是標准允許的。 從temp.param#6 :
6)非類型模板參數應具有以下類型之一(可能是 cv 限定的):
6.1)結構類型(見下文),
7)結構類型是以下之一:
7.2)左值引用類型,或
(強調我的)
這意味着std::string&
可以用作一個非類型模板參數,其中nameOk[0]
是一個有效的非類型模板參數並且程序是格式良好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.