2011-12-24 65 views
44

如何將一個適當做constexpr函數內的static_assert?例如:C++ 11 - constexpr函數中的static_assert?

constexpr int do_something(int x) 
{ 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

這不是有效的C++代碼11,因爲constexpr函數只能包含一個return語句。我認爲標準沒有例外,儘管GCC 4.7不允許我編譯這些代碼。

回答

52

這是無效的C++ 11代碼,因爲一個constexpr函數只能包含一個return語句。

這是不正確。 static_assertconstexpr功能都很好。什麼是罰款常數表達式中使用函數的參數,就像你這樣做。

你可以拋出,如果x <= 0。調用在需要常量表達式會失敗,上下文的函數編譯

constexpr int do_something(int x) { 
    return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0")); 
} 
+9

酷,我不知道'throw's在被稱爲在constexpr上下文中的'constexpr'功能會導致編譯失敗! – Xeo 2011-12-24 19:36:13

+16

@Xeo做任何事情* *在另一側的非constexpressy:將做的工作。 :) – 2011-12-24 19:44:15

+0

對'static_assert'的很好補充我必須說。 :) – Xeo 2011-12-24 19:46:16

20

這工作是有效的C++ 11的代碼,因爲模板參數只有編譯時間:

template <int x> 
constexpr int do_something() { 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

我面臨着與你在C++中使用常量表達式相同的問題。目前幾乎沒有關於constexprs的明確文件。請注意,gcc的問題跟蹤器中存在一些已知的錯誤,但您的問題似乎並不是一個錯誤。

請注意,如果你聲明裏面的類constexpr功能,您將無法使用它們的類中。這似乎也不是一個錯誤。

編輯:這是根據標準允許的:7.1.3狀態

...或複合語句只包含

  • 空語句,
  • static_assert -declarations
  • typedef聲明和別名聲明
    定義類或枚舉,
  • 使用申述,
  • using指令,
  • 和只有一個return語句
+1

編號constexpr只能是單個返回語句。 – 2012-12-14 22:08:01

+1

真的嗎?這個對我有用。我究竟做錯了什麼? http://ideone.com/3GOk7Q – cppist 2012-12-25 16:02:33

+1

我讀了標準。你是對的,這很好。我編輯了你的答案補充說。 – 2012-12-25 17:27:00

相關問題