【问题标题】:Meaning of phrase "constructors do not have names" in the C++ StandardC++ 标准中短语“构造函数没有名称”的含义
【发布时间】:2016-02-23 21:40:47
【问题描述】:

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

VS2015 and 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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我同意这不应该编译。

    它实际上比你想象的更离奇。试试这个:

    #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。

    【讨论】:

    • 嗯? “你好”是怎么打印出来的?
    • _message 在构造函数中被初始化为“hello”。 foo() 打印 _message
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2012-10-04
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多