【发布时间】:2016-02-23 21:40:47
【问题描述】:
在尝试理解 C++ 标准中的“构造函数没有名称”这一短语时,我似乎在 clang 中发现了一个错误。有人可以证实这一点吗?
VS2015and gcc 拒绝此代码,我认为 他们 它 are 是正确的.至少,这是我从 N4140 中的 §12.1[class.ctor]/2 得到的印象:
#include <iostream>
class A {
public:
A() { std::cout << "A()" << '\n'; }
};
int main()
{
A::A();
}
§12.1[class.ctor]/2 在 N4140 中:
构造函数用于初始化其类类型的对象。因为 构造函数没有名称,在名称期间永远不会找到它们 抬头; ...
使用上面的表达式A::A();,clang 通过名称查找找到构造函数,而它应该找到类型名称A。见live example。
【问题讨论】:
-
Clang 在处理注入类名时存在许多已知错误。无论如何,由于这个上下文不会忽略函数名称,
A::A命名构造函数并且由[class.qual]/p2 格式不正确@ -
@T.C.但是,根据§12.1/2,在表达式
A::A();中查找第二个A应该找到类型A而不是构造函数A()是否正确?这就是我想要理解的。 -
它唯一能找到的
A是类型,因为构造函数没有名字。然后根据[class.qual]/2,名称被认为是命名构造函数,但clang没有实现这部分。 -
@Belloc:它没有实现这部分,因为调用构造函数是非法的,所以程序会出错。相反,它依赖于解释该语句的唯一另一种方法,即构造一个
A类型的临时变量(当然,无论如何都会调用构造函数)。 -
@Belloc 它没有被忽略。在忽略函数名称的查找中,您可以命名一个类型,即使它会被同名的函数隐藏(例如,
struct stat中臭名昭著的stat)。
标签: c++ clang language-lawyer c++14