web-dev-qa-db-ja.com

2番目の宣言でテンプレート関数を「=削除」できますか?

次のコードを検討してください。

template <typename T> int foo();
template <typename T> int foo() = delete;

これは有効なC++ 11ですか?

  • GCC(9.1)は言う:はい!
  • clang(8.0)さんのコメント:いいえ!
  • nvcc(9.2)は言う:いいえ!
  • MSVC(19.20)は言う:はい! (C++ 14モードでは、C++ 11はサポートされません。)

...すべてを GodBolt で確認してください。

それで、どのコンパイラが適切で、どのコンパイラがs @#$%eですか? :-)

18
einpoklum

GCCとMSVCにはバグがあります。

[dcl.fct.def.delete]

4 ...関数の削除された定義は、関数の最初の宣言、または関数テンプレートの明示的な特殊化の場合、その特殊化の最初の宣言です...

これは、インスタンス化された宣言と定義も表していると思います。削除された関数を参照することはハードエラーであるため、削除済みとしてできるだけ早く宣言する必要があります。