如this page解釋的,constexpr
構造的主體的複合語句,如果沒有被刪除,也沒有缺省,必須滿足約束條件爲constexpr
函數體,也就是說,它可以包含任何陳述除外:是否允許constexpr構造函數返回語句?
- 一個
asm
聲明 - 一個
goto
語句 - 一個
try
- 嵌段 - 非文字類型或靜態或線程存儲時限或W的變量的定義沒有執行初始化
似乎該標準不會限制可能出現的return
語句的數量,而在C++ 11中,只允許一個語句。
現在,考慮下面的代碼:
class Thing
{
public:
// Shouldn't this constructor be fine under both C++11 and C++14?
constexpr Thing ()
{
return;
}
};
int main ()
{
Thing a_nice_thing;
}
鏘(3.5 -std = C++ 14)編譯它不錯,但GCC(4.9.1與-std = C++ 14)不抱怨:
constexpr構造沒有空體
但是,如果它發生了變化:
class Thing
{
public:
// This constructor is fine under both C++11 and C++14
constexpr Thing ()
{
static_assert(__cplusplus > 1 , "static_assert isn't the right mechanism to test this, since it wasn't available at earlier versions of the language");
}
};
int main ()
{
Thing a_nice_thing;
}
然後它在兩個編譯器下都編譯好。
由於GCC抱怨構造函數的體不是空的,不應該在後面的情況下也抱怨嗎?這是GCC中的一個錯誤嗎?是否允許constexpr構造函數返回語句?
注意:單個return
聲明是否真的值得不是這個問題的範圍,雖然很有趣,也許值得另外一個。我將單個return
聲明放在構造函數中,由於樣式的原因,構造函數的主體是空的。
然後,第一個例子不符合C++ 11標準。但是,當C++ 14語言啓用時,爲什麼GCC會抱怨呢? – Kalrish 2014-09-19 20:33:12
@Kalrish因爲GCC目前不支持C++ 14'constexpr'。 – 2014-09-19 20:36:14
謝謝。由於命令行切換,我的印象是(或大部分都是)。 – Kalrish 2014-09-19 20:37:30