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
.