如果函式模板被標記為已洗掉,是否允許像示例中那樣顯式實體化它:
template<class T>
int foo(T) = delete;
template int foo(int);
Clang 和 GCC 允許它,而 MSVC 列印錯誤:
error C2280: 'int foo<int>(int)': attempting to reference a deleted function
演示:https : //gcc.godbolt.org/z/49hfqnr4f
哪個編譯器就在這里?
uj5u.com熱心網友回復:
Clang 和 GCC 是對的。MSVC 可能指的是以下規則([dcl.fct.def.delete]/2):
隱式或顯式參考已洗掉函式而不是宣告它的程式是格式錯誤的。
顯式實體化定義是一個宣告,因此是允許的。
雖然,公平地說,在這種情況下,“指稱”的含義尚不清楚,因此語言律師有一些空間。但很明顯,一般來說,允許僅實體化模板以生成已洗掉的函式定義。[temp.inst]/3.2還提到了隱式實體化類模板時發生的已洗掉成員函式的隱式實體化。如果實體化模板化物體以生成已洗掉的函式定義的格式不正確,則不可能使用std::atomic具有已洗掉復制建構式的類模板。您的程式只是明確地執行在這些情況下隱式發生的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380307.html
上一篇:鏈接多載下標運算子[]的編譯失敗
