Ответ 1
Ваша интуиция верна. Это известная ошибка Clang 13403 со статусом NEW
.
При попытке понять выражение "конструкторы не имеют имен" в стандарте С++, похоже, я обнаружил ошибку в 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
. См. живой пример.
Ваша интуиция верна. Это известная ошибка Clang 13403 со статусом NEW
.
Я согласен, что это не должно компилироваться.
На самом деле это больше, чем вы думали. Попробуйте следующее:
#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 неявно создан.