Error de compilación de C ++ al construir el objeto con rvalue std :: string
¡Me enfrento a un error de compilación que ni siquiera sé cómo describir! Me desconcierta por completo.
La situación:
El código intenta crear un objeto en la pila con un rvalue std :: string que se inicializa con un char *.
El código:
#include <iostream>
#include <string>
class Foo
{
public:
Foo(double d)
: mD(d)
{
}
Foo(const std::string& str)
{
try
{
mD = std::stod(str);
}
catch (...)
{
throw;
}
}
Foo(const Foo& other)
: mD(other.mD)
{
}
virtual ~Foo() {}
protected:
double mD;
};
class Bar
{
public:
Bar(const Foo& a, const Foo& b)
: mA(a)
, mB(b)
{
}
virtual ~Bar() {}
protected:
Foo mA;
Foo mB;
};
int main(int argc, char* argv[])
{
if (argc < 3) { return 0; }
Foo a(std::string(argv[1]));
Foo b(std::string(argv[2]));
Bar wtf(a, b);
}
El error del compilador:
>g++ -std=c++11 wtf.cpp
wtf.cpp: In function ‘int main(int, char**)’:
wtf.cpp:58:17: error: no matching function for call to ‘Bar::Bar(Foo (&)(std::string*), Foo (&)(std::string*))’
Bar wtf(a, b);
^
wtf.cpp:38:9: note: candidate: Bar::Bar(const Foo&, const Foo&)
Bar(const Foo& a, const Foo& b)
^
wtf.cpp:38:9: note: no known conversion for argument 1 from ‘Foo(std::string*) {aka Foo(std::basic_string<char>*)}’ to ‘const Foo&’
wtf.cpp:35:7: note: candidate: Bar::Bar(const Bar&)
class Bar
^
wtf.cpp:35:7: note: candidate expects 1 argument, 2 provided
>
Tampoco creerá cuál es la solución / a (o al menosI no) Si llamo substr (0) en mi rvalue std :: string, el compilador se pacifica. Pero no veo por qué esto haría una diferencia. Después de todo...
std::string(argv[1]).substr(0)
... sigue siendo un valor. No veo por qué es diferente desde el punto de vista del compilador.
Es decir. El siguiente cambio a main (...) permite el éxito de la compilación:
int main(int argc, char* argv[])
{
if (argc < 3) { return 0; }
Foo a(std::string(argv[1]).substr(0));
Foo b(std::string(argv[2]).substr(0));
Bar wtf(a, b);
}
Par de puntos de datos adicionales:
Compilar sin C ++ 11 no hace ninguna diferencia (solo lo incluyo para obtener acceso a std :: stod (...), que está fuera del punto).g ++ (GCC) 5.4.0.El entorno de compilación es cygwin.Intenté modificar el constructor de Bar para tomar std :: string (en lugar de std :: string &), no afecta el error de compilación.estoymoribundo para saber cuál es este problema. Esto se siente tan fuera del campo izquierdo.
Gracias por cualquier ayuda.