考慮下面的代碼(available on gcc.godbolt.org):使用在非`constexpr`上下文`constexpr`功能的λ:鐺VS GCC
template <typename TF>
constexpr auto fn_x(TF f)
{
return f();
}
constexpr auto get_x()
{
return fn_x([]{ return 0; });
}
int main()
{
auto res = get_x();
}
它編譯下克++ 5.3.x和更新的(包括g ++ 6.xx)。
它不會下鐺++ 3.7.x並用以下錯誤較新的編譯:
error: constexpr function never produces a constant expression [-Winvalid-constexpr]
constexpr auto get_x()
^
note: subexpression not valid in a constant expression
return fn_x([]{ return 0; });
的可能解決方案,以使代碼編譯GCC和鐺使用「間接層」與decltype
,也擺脫在定義lambda的函數constexpr
:gcc.godbolt.org link。
根據標準哪個編譯器在這裏是正確的?
無論如何,也許與你的問題更相關:做任何你測試的編譯器聲明'get_x()'可以用在一個常量表達式中?如果不是,你的問題是「我允許將'constexpr'添加到永遠不能用於常量表達式的函數嗎?」 – hvd
@hvd:關於分號,我總是用'-Wpedantic'編譯真實的代碼,這會告訴我這個錯誤。我習慣於編寫lambda-heavy代碼('auto l = [] {...};'),所以有時我的大腦會在函數結尾自動添加分號。 –
@hvd它是有效的C++ 11 - ';'是一個*空聲明*。參見[CWG 569](http://wg21.link/cwg569)。 –