Parameters c++;0x:Rvalue引用参数与具有隐式const char*构造函数的类匹配

Parameters c++;0x:Rvalue引用参数与具有隐式const char*构造函数的类匹配,parameters,c++11,move,Parameters,C++11,Move,我有一个带有隐式const char*构造函数的类。我的直觉告诉我,隐式或显式调用构造函数都不重要,但显然,在const char*的情况下,这很重要,我不明白为什么。VC++编译器在下面的代码中为第一次调用foo匹配foo(conststring&t): struct Str { Str(const char *c) { value = c[0]; } Str(double c) { value = char(c);

我有一个带有隐式const char*构造函数的类。我的直觉告诉我,隐式或显式调用构造函数都不重要,但显然,在const char*的情况下,这很重要,我不明白为什么。VC++编译器在下面的代码中为第一次调用foo匹配foo(conststring&t):

struct Str
{
    Str(const char *c)
    {
        value = c[0];
    }
    Str(double c)
    {
        value = char(c);
    }
    char value;
};

void foo(const Str &t)
{
    cout << "const Str &t matched\n";
}

void foo(const Str &&t)
{
    cout << "const Str &&t matched\n";
}

void main()
{
    foo("v");
    foo(Str("v"));
    foo(5.0);
    foo(Str(5.0));
}
结构Str { Str(常量字符*c) { 值=c[0]; } Str(双c) { 值=字符(c); } 字符值; }; void foo(const Str&t) {
这是右值引用规范中的一个已知问题,现在已经解决了,但在MSVC10实现它们时没有发现。基本上,在决定是否绑定到左值或右值引用时,会考虑参数的原始左值或右值,而不是在需要进行任何转换之后d、 这是因为原始的右值引用过于贪婪地绑定到左值,并且为了确保右值引用的安全,采用了一些强有力的措辞,但结果证明有点过分热情。您不需要自定义类型来演示这一点-一个简单的
std::string
就可以了。

我甚至没有使用eck STL在本例中的行为是因为我假设它可以正确地与std::string一起工作(因为字符串文本到std::string的隐式转换非常常见。)@Matt Fisher:这是标准本身的一个缺陷(当时就存在),而不是任何库或单个编译器,这是修复更严重的错误类别的最后一刻更改。他们没有修复这个相对琐碎的细节并不是不合理的。