在下面的类(class)中,

你为什么要把运算符设置为explicit。我以为explicit是为了防止构造函数的隐式调用?

 class Content
            {
public:

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

最佳答案



从C++ 11开始,它也适用于user-defined conversions(又称强制转换运算符)。



在此上下文中使用的explicit关键字使转换仅适用于直接初始化和显式转换。请参阅[class.conv.fct¶2]下的内容:



这有助于您确保编译器不会针对您的意图尝试进行转换,以便您必须自己明确地进行转换,从而留出更少的错误空间。例子:

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

添加explicit:
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;
}

关于c++ - 显式关键字应用于运算符,而不是构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52482976/

10-11 18:25