Подтвердить что ты не робот

Значение фразы "конструкторы не имеют имен" в стандарте С++

При попытке понять выражение "конструкторы не имеют имен" в стандарте С++, похоже, я обнаружил ошибку в clang. Может ли кто-нибудь подтвердить это?

VS2015 и gcc отклоняет этот код, и я думаю, что they it are верен, По крайней мере, это впечатление, которое я получаю из §12.1 [class.ctor]/2 в N4140:

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

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

§12.1 [class.ctor]/2 в N4140:

Конструктор используется для инициализации объектов своего типа класса. Потому как конструкторы не имеют имен, они никогда не встречаются во время имени Погляди;...

С выражением A::A(); выше, clang находит конструктор по имени, когда он должен найти имя типа A. См. живой пример.

4b9b3361

Ответ 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 неявно создан.