2011-05-15 24 views
0

我有一个带有隐式const char *构造函数的类。我的直觉告诉我,不管是隐式还是显式调用构造函数都没有关系,但显然在const char *的情况下它确实很重要,我不明白为什么。在VC++编译器匹配foo(常量字符串& t)为第一次调用下面的代码foo的:C++ 0x:Rvalue引用参数匹配隐式const char *构造函数的类

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

它的foo其他一切的海峡& & T版相匹配。为什么它在隐式“v”情况下表现不同?我应该改变以获得foo版本的匹配吗? (想象一下foo是例如向量::的push_back功能 - 我宁可不要明确地投我的所有字符串文字。)

回答

1

这是一个已知的问题与右值引用的规范,这是现在固定的,但WASN”当MSVC10实施他们的时候才会发现。基本上,在决定是否绑定左值或右值引用时,可以考虑自变量的左值或右值,如果需要,可能会发生任何转换后,将会使用而不是。这是因为原始的右值引用对于左值的绑定过于贪婪,并且为了确保右值引用的安全而采用了一些强有力的措辞,但事实证明它有点太过于狂热。你不需要自定义类型来演示这一点 - 一个简单的std::string将会很好。

+0

我还没有在这种情况下检查STL的行为,因为我认为它可以正常工作与std :: string(看到字符串文字隐式转换为std :: string是非常普遍的。) – 2011-05-15 23:54:29

+1

@Matt Fisher :这是标准本身的错误(因为它存在),而不是任何库或个人编译器,这是修复更严重错误的最​​后时刻。他们没有解决这个相对琐碎的细节并不是不合理的。 – Puppy 2011-05-16 00:02:39

相关问题