2014-09-19 69 views
6

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聲明放在構造函數中,由於樣式的原因,構造函數的主體是空的。

回答

5

GCC目前doesn't support C++ 14的版本的constexpr,因此即使-std=c++14你仍然可以得到C++ 11的constexpr

構造函數constexpr的C++ 11限制是(§7.1.5[dcl。constexpr]/P4):

化合物語句其功能體應包含唯一

  • 空語句,
  • static_assert-聲明
  • typedef聲明和別名聲明不定義類或枚舉離子,
  • 使用-聲明
  • using指令;

(還有很多其他的限制,同時,我限制了報價有關這一問題的一個)

return語句在constexpr構造函數允許在C++ 11,而static_assert是。

+0

然後,第一個例子不符合C++ 11標準。但是,當C++ 14語言啓用時,爲什麼GCC會抱怨呢? – Kalrish 2014-09-19 20:33:12

+0

@Kalrish因爲GCC目前不支持C++ 14'constexpr'。 – 2014-09-19 20:36:14

+0

謝謝。由於命令行切換,我的印象是(或大部分都是)。 – Kalrish 2014-09-19 20:37:30

1

C++ 14它改變,如包括的draft C++14 standard部7.1.5 constexpr符

其功能體應爲=刪除,=默認情況下,或不包含一個化合物語句

- 一個ASM-定義,

- goto語句,

- try塊,或

- 或靜態或線程存儲持續時間或用於非文字類型的 沒有進行初始化

和構造必須遵循的附加restrictons的變量的定義:

- 它的函數體應該是= default,或者它的函數體的複合語句應該滿足constexpr函數的函數體的約束條件;

- 每個非變量非靜態數據成員和基類子對象都應該被初始化(12.6.2);

- 如果該班級是具有不同成員的工會(9。5),其中之一應該初始化;

- 如果該類對於具有 變體成員的每個匿名聯盟成員都是類聯合類,但不是聯合體,則其中的一個應該被初始化;

- 對於非委託構造函數,選擇用於初始化非靜態數據成員的每個構造函數,並且基類子對象應爲constexpr構造函數;

- 對於委託構造函數,目標構造函數應該是constexpr構造函數。

,並沒有阻止return語句也不是static_assert

在C++ 11

它包括限制:

- 其功能體的複合語句只能包含

- 空語句,

- static_assert申述

- 未定義類或枚舉的typedef聲明和別名聲明,

- 使用申述,

- 和using指令

不允許return語句。

相關問題