#include <algorithm>#include <stdexcept>template <typename T>struct maybe { maybe() : valID_(false) {} maybe(T value) : valID_(true) { new (&value_) T(value); } operator T&&() { return std::move(value()); } explicit operator bool() const { return valID_; } T& value() { if (!valID_) { throw std::runtime_error("boom"); } return value_; }private: union { T value_; }; bool valID_;};int main() { // fine,uses operator bool() maybe<std::pair<int,int>> m0; if (m0) { std::pair<int,int> p = m0; (voID)p; } // throws error,uses operator T&&() maybe<double> m1; if (m1) { double p = m1; (voID)p; }}解决方法 每当你写:
if (x)
这相当于写了:
bool __flag(x);if (__flag)
这称为bool的上下文转换(请注意,它是直接初始化,因此显式转换函数是候选者).
当我们对m0的构造进行重载解析时,只有一个有效的候选者:显式运算符bool()const.
但是当我们对m1的构造进行重载解析时,有两个:显式运算符bool()const和operator double&&(),因为double可以转换为bool.后者是更好的匹配,因为bool转换函数具有额外的const限定,即使我们必须进行额外的双重转换.因此,它赢了.
只需从您的界面中删除运算符T&&(),因为它对此类型没有多大意义.
总结以上是内存溢出为你收集整理的了解转换运算符的C选择全部内容,希望文章能够帮你解决了解转换运算符的C选择所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)