为了账号安全,请及时绑定邮箱和手机立即绑定

C ++隐式转换

C ++隐式转换

C++
慕容森 2019-12-06 11:06:49
关于我最近的答案“ 在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提供报价。
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

我认为Sharptooth的答案很准确。标题为“转换”的C ++标准(SC22-N-4411.pdf)第12.3.4节明确规定,仅允许进行一次隐式的用户定义转换。

1类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换(第4章),初始化(8.5)和显式类型转换(5.4、5.2.9)。

2用户定义的转换仅适用于明确的转换(10.2,12.3.2)。转换遵守访问控制规则(第11条)。歧义解决后将应用访问控制(3.4)。

3 [注意:有关在函数调用中使用转换的讨论以及下面的示例,请参见13.3。—尾注]

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


查看完整回答
反对 回复 2019-12-06
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

C ++编程语言(第4版)(第18.4.3节)说:


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


该“用户定义的”部分听起来似乎是允许的,如果某些隐式转换位于本机类型之间,则可以允许进行多次隐式转换。


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 617 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信