[英]Why can't lambda, when cast to function pointer, be used in constexpr context?
考慮一個例子:
template <void (*Foo)()>
struct S {
};
int main() {
struct A {
static void x() { }
};
S<&A::x> s;
}
代碼在clang中編譯,gcc認為x
沒有鏈接...對於非常類似的例子,只是在使用lambda表達式時:
template <void (*Foo)()>
struct S {
};
int main() {
auto lambda = []{};
S<+lambda> s;
}
gcc和clang都同意不編譯代碼:根據gcc,由unary +返回的函數沒有鏈接,相反,clang狀態表示對該函數的強制轉換操作符未聲明為constexpr。 是否有任何理由不允許lambda強制轉換為在constexpr上下文中使用的函數指針?
查找編譯器和現場演示產生的以下錯誤:
gcc :
prog.cc:7:14:錯誤:'main():::: _ FUN'不是類型'void(*)()'的有效模板參數,因為'static constexpr void main():::: _ FUN( )'沒有聯系
clang :
prog.cc:7:8:注意:非constexpr函數'operator void(*)()'不能用於常量表達式
Clang 尚未實施constexpr
lambdas 。
GCC在其他方面落后。 [temp.arg.nontype] / 2唯一有趣的約束是參數應該是一個常量表達式。 但是[expr.const] /(5.2)使它成為一個,所以這是完全有效的。 也許海灣合作委員會尚未實施N4198 ,這消除了聯系要求。
請注意, constexpr
lambda和no-linkage函數指針模板參數都是后C ++ 14特性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.