加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 应用于运算符而不是构造函数的显式关键字

发布时间:2020-12-16 04:59:49 所属栏目:百科 来源:网络整理
导读:在下面的课程中, 为什么要让运算符明确.我认为明确是为了防止对构造函数的隐式调用? class Content {public: virtual ~Content() = 0; virtual explicit operator float(); virtual explicit operator long long(); virtual explicit operator std::string(
在下面的课程中,

为什么要让运算符明确.我认为明确是为了防止对构造函数的隐式调用?

class Content
            {
public:

 virtual ~Content() = 0;
 virtual explicit operator float&();
 virtual explicit operator long long&();
 virtual explicit operator std::string&()
}

解决方法

I thought that explicit was to prevent implicit calling of
constructors?

从C 11开始,它也适用于user-defined conversions(也就是演员操作符).

Why would you make the operators explicit

在此上下文中使用,explicit关键字使转换仅适用于直接初始化和显式转换.见[class.conv.fct?2]:

A conversion function may be explicit ([dcl.fct.spec]),in which case
it is only considered as a user-defined conversion for
direct-initialization
([dcl.init]). Otherwise,user-defined
conversions are not restricted to use in assignments and
initializations.

这有助于您确保编译器不会针对您的意图尝试转换,因此您必须自己明确地进行转换,从而减少出错的空间.例:

struct Foo
{
    explicit operator int() {return 0;}
    operator int*() {return nullptr;}
};

int main()
{
    Foo foo;

    //int xi = foo; // Error,conversion must be explicit
    int i = static_cast<int>(foo); // OK,conversion is explicit
    int* i_ptr = foo; // OK,implicit conversion to `int*` is allowed

    int i_direct(foo); // OK,direct initialization allowed
    int* i_ptr_direct(foo); // OK,direct initialization after implicit conversion

    return 0;
}

它还可以帮助解决多个转换选项适用的情况下的歧义,使编译器没有标准来决定选择哪一个:

struct Bar
{
    operator int() {return 1;}
    operator char() {return '1';}
};

int main()
{
    Bar bar;    
    //double d = bar; // Error,implicit conversion is ambiguous    
    return 0;
}

添加明确:

struct Bar
{
    operator int() {return 1;}
    explicit operator char() {return '1';}
};

int main()
{
    Bar bar;    
    double d = bar; // OK,implicit conversion to `int` is the only option    
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读