C ++标准中短语“构造函数没有名称”的含义

时间:2015-11-21 11:51:14

标签: c++ clang language-lawyer c++14

在尝试理解C ++标准中的“构造函数没有名称”这一短语时,似乎我在clang中发现了一个错误。有人可以证实这一点吗?

VS2015 gcc拒绝此代码,我认为他们 是对的。至少,这是我从N4140的§12.1[class.ctor] / 2得到的印象:

#include <iostream>
class A {
public:
    A() { std::cout << "A()" << '\n'; }
};

int main()
{
  A::A();
}
N4140中的

§12.1[class.ctor] / 2

  

构造函数用于初始化其类类型的对象。因为   构造函数没有名称,在名称中从未找到它们   抬头; ...

使用上面的表达式A::A();,clang通过名称查找找到构造函数,而它应该找到类型名称A。见live example

2 个答案:

答案 0 :(得分:14)

你的直觉是正确的。这是已知的Clang错误13403,状态为NEW

答案 1 :(得分:6)

我同意这不应该编译。

它实际上比你想象的更加古怪。试试这个:

#include <iostream>
#include <string>

class A {
public:
    A() {
        std::cout << "A() " << this << '\n';
    }

    void foo() {
        std::cout << _message << std::endl;
    }

    std::string _message = "hello";
};

int main()
{
    A::A().foo();
}

示例输出:

A() 0x7fff5cd105f8
hello

在我看来,好像隐含地创建了一个未命名的A.