【问题标题】:Can you `= delete` a templated function on a second declaration?你能在第二个声明中`= delete` 一个模板函数吗?
【发布时间】:2019-10-17 22:58:38
【问题描述】:

考虑以下代码:

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 ? :-)

【问题讨论】:

  • 那么它是有效的会很奇怪,因为第一行说的是“嗯,有一个名为 foo 的函数在某处定义”,这与 delete 正好相反。
  • @OznOg @einpoklum 臭名昭著地提出了非常奇怪的问题:)。但是发现 gcc 的 bug 很棒!
  • no pb,这只是我的闲聊;这个问题对我来说完全有效。
  • MSVC 也接受这个:gcc.godbolt.org/z/CFIEgb
  • @πάνταῥεῖ:我收到的最讨人喜欢的 SE 评论!谢谢:-)

标签: c++ gcc clang nvcc compiler-bug


【解决方案1】:

GCC 和 MSVC 有一个错误。

[dcl.fct.def.delete]

4 ... 删除的函数定义应该是函数的第一个声明,或者,对于函数模板的显式特化,该特化的第一个声明...

我相信它也代表实例化的声明和定义。由于引用已删除的函数是硬错误,因此必须尽快将其声明为已删除。

【讨论】:

  • 为什么“必须”在第一次提到它之前尽快将其声明为已删除 - 而不是 - ?此外,即使稍后出现删除,编译器也会在看到删除而不是看到引用时注意到错误。但是 - 接受。
  • 另外 - 在 C++14 和 C++17 中仍然是这种情况吗?只是好奇,我不想提出另一个问题。
  • 针对 GCC 的错误报告 filed
  • @einpoklum - 引用它的代码可能位于第一个声明和定义之间。我想在第一次声明时要求它是最简单的。看到我引用了 n4659(C++17,没有注意到标签),是的。我查了n3337(c++11),写法一样。
  • @bogdan - 是的。但话又说回来,它在模板方面并不是什么新鲜事。每当出现这个主题时,都必须提出 temp.expl.spec/7 :)
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多