簡體   English   中英

我可以使用C ++ 17 captureless lambda constexpr轉換運算符的結果作為函數指針模板非類型參數嗎?

[英]Can I use the result of a C++17 captureless lambda constexpr conversion operator as a function pointer template non-type argument?

在回答時如何編寫看起來像方法的lambda表達式? 我試圖通過利用這樣一個事實將無捕獲的lambda變成一個成員函數指針,因為C ++ 17,無捕獲的lambdas有一個constexpr轉換操作符到它們的函數指針類型。

所以我提出了一個問題:

template<void(*)()> struct A{};

int main()
{
  A<static_cast<void(*)()>([]{})>{}; // 1

  constexpr auto fp = static_cast<void(*)()>([]{});
  A<fp>{}; // 2
}

現在,這在clang(從5.0.0開始)編譯,但gcc(> = 7.2)抱怨:

error: lambda-expression in template-argument
   A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
                            ^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
   A<fp>{}; // 2

問題是, 誰是對的?

這是一個gcc bug,提交83258

在C ++ 14中,我們曾經對指針類型的非類型模板參數有鏈接要求 但是在C ++ 17中(作為N4268的結果),參數只需要是正確類型的轉換常量表達式 ,還有一些其他限制(這里沒有任何限制)。 一旦我們可以構造fp ,我們應該能夠將它用作模板參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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