带多个参数的显式构造函数

新手上路,请多包涵

使构造函数具有多个参数 explicit 有任何(有用的)效果吗?

例子:

 class A {
    public:
        explicit A( int b, int c ); // does explicit have any (useful) effect?
};

原文由 Peter G. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 673
2 个回答

直到 C++11,是的,没有理由在多参数构造函数上使用 explicit

由于初始化列表,这在 C++11 中发生了变化。基本上,带有初始化列表的复制初始化(但不是直接初始化)要求构造函数不被标记为 explicit

例子:

 struct Foo { Foo(int, int); };
struct Bar { explicit Bar(int, int); };

Foo f1(1, 1); // ok
Foo f2 {1, 1}; // ok
Foo f3 = {1, 1}; // ok

Bar b1(1, 1); // ok
Bar b2 {1, 1}; // ok
Bar b3 = {1, 1}; // NOT OKAY

原文由 Sneftel 发布,翻译遵循 CC BY-SA 3.0 许可协议

您会偶然发现它进行大括号初始化(例如在数组中)

 struct A {
        explicit A( int b, int c ) {}
};

struct B {
         B( int b, int c ) {}
};

int main() {
    B b[] = {{1,2}, {3,5}}; // OK

    A a1[] = {A{1,2}, A{3,4}}; // OK

    A a2[] = {{1,2}, {3,4}}; // Error

    return 0;
}

原文由 StoryTeller - Unslander Monica 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题