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

在下面的课程中,

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

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;
}

相关文章

文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...
文章浏览阅读1.8k次,点赞11次,收藏37次。因为自己对决策树...
文章浏览阅读492次。C++ 设计模式之策略模式
文章浏览阅读683次。我也算是个C++的小白,对于C++中的谓语我...
文章浏览阅读225次。又看了一遍操作符的东西,感觉之前对操作...