【问题标题】:const qualifier accepted in ctor declaration/definition (llvm bug?)ctor 声明/定义中接受的 const 限定符(llvm 错误?)
【发布时间】:2013-11-24 23:55:35
【问题描述】:

我的编译器(实际上是 Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn))接受(编译)该代码:

class X {
private:
  int i;
public:
  const X() { cout << "here" << endl; i=0; }
  void f() const {}
  void g() {}
};

int main() {
  const X x;
  x.f();
  //  x.g();
  X y;
  y.f();
  y.g();
}

就好像没有 const 限定符引导 ctor 定义一样。我尝试了-Wall-pedantic 不同类型的标准激活,总是一样的......所以:

  • 我错过了什么吗?我无法发现它在最新标准中的语法是正确的……
  • 这是 gcc/llvm 的错误吗?似乎gcc/llvm 默默地忽略了const
  • 这是我错过的功能,我的示例无法证明其有用性吗?

注意:gcc 3.4.3 不编译,gcc 4.4.5 也不编译。

【问题讨论】:

  • 嗯,这似乎不允许异常规范。在 C++1y 的最新草案中有所不同;它明确允许异常规范和属性,但似乎仍然不允许类型说明符,例如const
  • 提交了bugreport

标签: c++ gcc constructor constants clang


【解决方案1】:

据我所知,这看起来不像是有效的语法,draft C++ standard 部分 12.1 Constructors 段落 1 说:

构造函数没有名称。特殊的声明符语法用于声明或定义构造函数。 语法使用:

— 一个可选的 decl-specifier-seq,其中每个 decl-specifier 是函数说明符或 constexpr,

——构造函数的类名,和

——参数列表

我们可以从7.1.2部分看到函数说明符如下:

function-specifier:
 inline
 virtual
 explicit

通过comment abovebug report 中的 Ali 对此进行了确认并解决了。

【讨论】:

  • 对!我看错了!事实上,我迷失在 ptr-declarator 定义中,错过了 function-specifier。我的草稿版本似乎与您的不完全相同。谢谢!还有一个:“你会把它定性为 bug 还是未知的 g++ 功能?”
  • @Jean-BaptisteYunès 我添加了一个指向我正在使用的版本的链接,我检查了一个旧版本,语言非常相似。这个previous thread 是不同版本标准的好资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2019-07-19
  • 1970-01-01
  • 2023-01-11
  • 2019-12-04
相关资源
最近更新 更多