簡體   English   中英

為什么lambda在轉換為函數指針時不能在constexpr上下文中使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM