我的問題是,下面的代碼是否有效:static_assert在未初始化模板類有效的專業化
template<int i> class Class
{
static_assert(sizeof(i) == 0, "Class instantiated with i != 1");
};
template<> class Class<1> {};
這個片段與g++
編譯。但clang++
被困在static_assert
:
error: static_assert failed "Class instantiated with non-int type"
使用一種類型,而不是像int
template<typename T> class Class
{
static_assert(sizeof(T) == 0, "Class instantiated with non-int type");
};
template<> class Class<int> {};
,模板由兩種編譯器所接受。完全相同的模式適用於功能模板。
我發現open-std.org::Non-dependent static_assert-declarations,但這似乎並不適用,因爲我的static_assert
依賴於模板參數。
您可以檢查godbolt.org
編輯描述的行爲:正如約翰·倫德伯格的評論指出我的問題是錯誤的。確實sizeof(i)
不依賴於模板參數。 R.Sahu也完全正確:斷言i != 1
會更有意義。爲此,兩個編譯器都接受代碼。
但是,上面的例子仍然編譯爲g++
。由於open-std.org::Non-dependent static_assert-declarations適用於這種情況(我在這方面的錯誤問題再次道歉):g++
在編譯代碼時沒有錯誤實際上是錯誤的?
我不認爲你是正確「因爲我的static_assert是依賴於模板參數。」 sizeof(i)不依賴於i的*值*。 –
爲什麼在第一個例子中使用sizeof?我的類型爲int,sizeof(i)與sizeof(int)相同。也許在斷言中你想直接使用我。 – Fabio
你的意思是使用'static_assert(i!= 1,「使用i!= 1實例化的類)」;'有沒有機會? –