Parameters c++;0x:Rvalue引用参数与具有隐式const char*构造函数的类匹配
我有一个带有隐式const char*构造函数的类。我的直觉告诉我,隐式或显式调用构造函数都不重要,但显然,在const char*的情况下,这很重要,我不明白为什么。VC++编译器在下面的代码中为第一次调用foo匹配foo(conststring&t):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);
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:这是标准本身的一个缺陷(当时就存在),而不是任何库或单个编译器,这是修复更严重的错误类别的最后一刻更改。他们没有修复这个相对琐碎的细节并不是不合理的。