我最近回答了一个问题,What other useful casts can be used in C++,得到了一些评论指出我的C++转换理解存在问题。为了澄清这个问题,请考虑以下代码:
#include <string>
struct A {
A( const std::string & s ) {}
};
void func( const A & a ) {
}
int main() {
func( "one" ); // error
func( A("two") ); // ok
func( std::string("three") ); // ok
}
我的断言是第一个函数调用是错误的,因为从const char *到A没有转换。虽然从字符串到A有一个转换,但使用它将涉及多个转换。我的理解是这不被允许,而且g++ 4.4.0和Comeau编译器似乎证实了这一点。在Comeau中,我得到以下错误:"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func( "one" ); // error
如果你能指出我哪里错了,无论是在这里还是在原回答中,请尽快指出并参考C++标准。而根据C++标准的回答似乎是:对于单个值,最多只会隐式应用一个用户定义的转换(构造函数或转换函数)。感谢Abhay提供的引用。
std::string
不是语言的一部分,对它的转换是“用户定义”的。至少这是我的理解,如果我错了,请纠正我。如果问题更明确一些会更好。std::string
的确切状态可能对于老的C++程序员来说非常清晰,但对于这个世纪学习该语言的人来说并不容易意识到。 - just somebody