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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta