C++11 FAQ中文版:显式转换操作符
2012-05-02 10:52
225 查看
二27
Year 2011陈 良乔C++11
FAQ
显式转换操作符
C++98标准提供隐式和显式两种构造函数,也就是说,声明为显式形式的构造函数所定义的转换只能用于显式转换,而其他形式的构造函数则用于隐式转换。例如:
然而,构造函数不是定义转换的唯一途径。如果不能更改一个类,那么可以从另一个不同的类中定义一个转换操作符。例如:
(译注:这段代码的意义,实际是通过SS作为中间桥梁,将int转换为S。)
遗憾的是,这里并没有显式转换操作符(因为有问题的例子很少)。C++11通过允许转换操作符成为显式形式而弥补了这个漏失(?)。例如:
参考:
Standard: 12.3 Conversions
[N2333=07-0193] Lois Goldthwaite, Michael Wong, and Jens Maurer:
Explicit Conversion Operator (Revision 1).
Year 2011陈 良乔C++11
FAQ
显式转换操作符
C++98标准提供隐式和显式两种构造函数,也就是说,声明为显式形式的构造函数所定义的转换只能用于显式转换,而其他形式的构造函数则用于隐式转换。例如:
struct S { S(int); }; // “普通构造函数”表明是隐式转换 S s1(1); // 正确 S s2 = 1; // 正确 void f(S); //正确(但是经常会产生意外结果——如果S是vector类型会怎么样呢?)(?) f(1); struct E { explicit E(int); }; // 显式构造函数 E e1(1); // 正确 E e2 = 1; // 错误(但是常常会让人感到意外——这怎么会错呢?) void f(E); // 错误(不一定会产生意外 // 例如从int型到std::vector类型转换的构造函数是显式的)(?) f(1);
然而,构造函数不是定义转换的唯一途径。如果不能更改一个类,那么可以从另一个不同的类中定义一个转换操作符。例如:
struct S { S(int) { } /* … */ }; struct SS { int m; SS(int x) :m(x) { } // 因为结构体S中没有S(SS);不存在干扰 operator S() { return S(m); } }; SS ss(1); S s1 = ss; // 正确;类似隐式构造函数 S s2(ss); // 正确;类似隐式构造函数 void f(S); f(ss); // 正确;类似隐式构造函数
(译注:这段代码的意义,实际是通过SS作为中间桥梁,将int转换为S。)
遗憾的是,这里并没有显式转换操作符(因为有问题的例子很少)。C++11通过允许转换操作符成为显式形式而弥补了这个漏失(?)。例如:
struct S { S(int) { } }; struct SS { int m; SS(int x) :m(x) { } // 因为结构体S中没有S(SS)(译注:因为结构体S中没有定义S(SS), // 无法将SS转换为S,所以只好在SS中定义一个返回S的转换操作符, // 将自己转换为S。转换动作,可以由目标类型S提供,也可以由源类型SS提供。) explicit operator S() { return S(m); } }; SS ss(1); S s1 = ss; // 错误;类似显式构造函数 S s2(ss); // 正确;类似显式构造函数 void f(S); f(ss); // 错误;类似显式构造函数
参考:
Standard: 12.3 Conversions
[N2333=07-0193] Lois Goldthwaite, Michael Wong, and Jens Maurer:
Explicit Conversion Operator (Revision 1).
相关文章推荐
- C++11 FAQ中文版:共享资源的智能指针——shared_ptr
- C++11 FAQ中文版:序列for循环语句
- C++11 FAQ中文版:unique_ptr
- C++11 FAQ中文版:返回值类型后置语法
- C++11 FAQ中文版:std::function 和 std::bind
- C++11 FAQ中文版:weak_ptr
- C++11 FAQ中文版:std::function 和 std::bind
- C++11 FAQ中文版:std::function 和 std::bind
- C++11 FAQ中文版:类成员的内部初始化
- C++11 FAQ中文版:auto – 从初始化中推断数据类型
- C++11 FAQ中文版:std::function 和 std::bind
- C++11 FAQ中文版:继承的构造函数
- C++11 FAQ中文版:枚举类——具有类域和强类型的枚举
- C++11FAQ 中文版带完整书签141页PDF
- C++11 FAQ中文版:常量表达式(constexpr)
- C++11 FAQ中文版:Lambda表达式
- C++11FAQ 中文版带完整书签141页PDF
- C++11 FAQ中文版:decltype – 推断表达式的数据类型
- C++11 FAQ中文版:std::function 和 std::bind
- C++11 FAQ中文版:控制默认函数——默认或者禁用