Erro de compilação do C ++ na construção de objeto com rvalue std :: string

Estou diante de um erro de compilação que nem sei descrever! Isso me deixa completamente perplexo.

A situação:

O código tenta criar um objeto na pilha com um rvalue std :: string que é inicializado com um caractere *.

O 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);
}

O erro do 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
>

Você não vai acreditar no que é uma solução alternativa (ou pelo menosI não). Se eu chamar substr (0) no meu rvalue std :: string, o compilador será pacificado. Mas não vejo por que isso faria diferença. Depois de tudo...

std::string(argv[1]).substr(0)

... em si ainda é um valor. Não vejo por que é diferente do ponto de vista do compilador.

I.e. a seguinte alteração em main (...) permite o sucesso da compilação:

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

Dois pontos de dados adicionais:

Compilar sem o C ++ 11 não faz diferença (eu apenas o incluo para obter acesso ao std :: stod (...), que está além do ponto).g ++ (GCC) 5.4.0.O ambiente de compilação é cygwin.Eu tentei modificar o construtor de Bar para pegar std :: string (em vez de std :: string &) - isso não afeta o erro de compilação.

Eu estoumorrendo para saber qual é esse problema. Isso parece tão fora do campo esquerdo.

Obrigado por qualquer ajuda.

questionAnswers(3)

yourAnswerToTheQuestion