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

Bel*_*loc 22 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();
}
Run Code Online (Sandbox Code Playgroud)

N4140中的§12.1[class.ctor]/2:

构造函数用于初始化其类类型的对象.因为构造函数没有名称,所以在名称查找期间永远不会找到它们; ...

使用A::A();上面的表达式,clang通过名称查找找到构造函数,A而不是它应该找到类型名称.查看实例.

101*_*010 14

你的直觉是正确的.这是一个已知的具有状态的Clang bug 13403NEW.


Ric*_*ges 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();
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

A() 0x7fff5cd105f8
hello
Run Code Online (Sandbox Code Playgroud)

它看起来好像是一个未命名的A被隐式创建.