强>和C++标准的答案似乎是:< /强> ,c++,C++" /> 强>和C++标准的答案似乎是:< /强> ,c++,C++" />

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 } 如果你可以指出,我在哪里错了,或者在这里或者在原来的答案中,最好是参照C++标准,请这样做。 >强>和C++标准的答案似乎是:< /强>

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 } 如果你可以指出,我在哪里错了,或者在这里或者在原来的答案中,最好是参照C++标准,请这样做。 >强>和C++标准的答案似乎是:< /强> ,c++,C++,最多一个用户定义的转换 (构造函数或转换函数) 隐式应用于单个值 感谢Abhay提供的报价。没错,只允许一次隐式转换 一行中的两个转换可以使用转换运算符和参数化构造函数的组合来执行,但这在VC++中会导致“非法转换;隐式应用了多个用户定义的转换”,这是有原因的 只有一级用户定义的 隐式转换是合法的 “用户定义”部分听起来像是允许多个隐式转换,如果一些是在原生类型之间。我认为sharptooth的答案是准确的。C++标准(SC22-N-1111.pdf)部分.2.3.4标题“转换”表明,只允许一个

最多一个用户定义的转换 (构造函数或转换函数) 隐式应用于单个值

感谢Abhay提供的报价。

没错,只允许一次隐式转换

一行中的两个转换可以使用转换运算符和参数化构造函数的组合来执行,但这在VC++中会导致“非法转换;隐式应用了多个用户定义的转换”,这是有原因的

只有一级用户定义的 隐式转换是合法的


“用户定义”部分听起来像是允许多个隐式转换,如果一些是在原生类型之间。

我认为sharptooth的答案是准确的。C++标准(SC22-N-1111.pdf)部分.2.3.4标题“转换”表明,只允许一个隐式用户定义转换。 1类对象的类型转换可以通过 构造函数和通过转换 功能。这些 转换称为用户定义的转换,使用 对于隐式类型转换(子句 4) ,为 初始化(8.5)和显式类型转换(5.4, 5.2.9)

2用户定义的转换仅适用于以下情况: 明确的(10.2,12.3.2)。 转换遵循 访问控制规则(第11条)。访问控制在 歧义解决(3.4)

3[注:有关转换使用的讨论,请参见13.3 在函数调用和示例中 在下面-结束 注]

4最多一个用户定义的转换(构造函数或转换 函数)隐式应用于 单一的 价值观


大家似乎已经达成共识:是的,你是对的

但是,这个问题/答案可能会成为C++ StAdvExcel隐式转换的参考点,我想添加模板参数的规则是不同的。 对于用于模板参数推断的参数,不允许进行隐式转换。这似乎很明显,但却可能导致微妙的怪异

例如,std::字符串加法运算符

 std::string s;
 s += 67;    // (1)
 s = s + 67; // (2)
(1) 编译并运行良好,
运算符+=
是一个成员函数,已通过为s(to
char
)实例化
std::string
推导出模板字符参数。因此,允许进行隐式转换(
int
->
char
),结果s包含67的字符等价物,例如,在ASCII中,这将成为“C”


(2) 给出一个编译器错误,因为
运算符+
被声明为自由函数,这里的模板字符参数用于推断。

很抱歉,我在对您的答案的注释中完全错了。我读到“重载解析用于选择要调用的用户定义转换”,我对自己说“好吧,那么它将解析为(字符串常量&)并将其传递为“一”,但我完全没有想到13.3.3.1.2会说什么:“用户定义转换序列由初始标准转换序列、用户定义转换(12.3)和第二个标准转换序列组成。”“->字符串不是标准转换序列,但需要另一个用户定义的转换序列!只要我没有失去我的弹珠:-)好问题!讨论表明,
std::string
不是语言的一部分,与它的转换是“用户定义的”。至少这是我的理解,如果我错了,请纠正我。如果这个问题能更明确一些就好了。<>代码> STD::String >对老C++的手可能是很清楚的,但是对于本世纪语言的人来说,这并不容易实现。@正确的是:STD::String只是一个图书馆类,你可以自己编写一个相同的类,因此,语言没有为它指定任何特殊处理。我觉得有必要分享我为什么喜欢在特定场景中使用隐式转换:即,当我想将一个简单类型的变量与一个对该变量执行相关函数的类耦合时。除了隐式转换之外,我还在类中提供了一个返回值的函数,与std::string提供c_str()的方式相同。然后,您可以在需要的地方使用额外的类功能,也可以在其他地方使用非常轻量级的功能,同时将相关功能保持在一起。
 std::string s;
 s += 67;    // (1)
 s = s + 67; // (2)