c++ clang language-lawyer c++14

Significado de la frase "los constructores no tienen nombres" en el estándar de C++



clang language-lawyer (2)

Estoy de acuerdo en que esto no debe compilar.

En realidad es más bizzare de lo que pensabas. Prueba esto:

#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(); }

salida de ejemplo:

A() 0x7fff5cd105f8 hello

Me parece que se está creando implícitamente una A sin nombre.

Al tratar de entender la frase "los constructores no tienen nombres" en el estándar de C ++, parece que encontré un error en el sonido. ¿Alguien podría confirmar esto?

VS2015 y gcc rechazan este código, y creo que es correcto. Al menos, esta es la impresión que recibí de §12.1 [class.ctor] / 2 en N4140:

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

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

Se utiliza un constructor para inicializar objetos de su tipo de clase. Debido a que los constructores no tienen nombres, nunca se encuentran durante la búsqueda de nombres; ...

Con la expresión A::A(); arriba, clang encuentra el constructor por búsqueda de nombre, cuando debería encontrar el nombre de tipo A lugar. Ver ejemplo en vivo .


Tu intuición es correcta. Este es un error conocido de Clang 13403 con estado NEW .