簡體   English   中英

std::string& 類型的非類型模板參數在 gcc 中編譯,但在 clang 中不編譯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM