为什么std :: stack的这些构造函数是显式的

时间:2016-06-29 14:25:21

标签: c++ c++11 stack

我对std::stack为什么这两个构造函数是explicit

有疑问
     explicit stack( const Container& cont = Container() );
     explicit stack( Container&& cont = Container() );

注意: Source

2 个答案:

答案 0 :(得分:3)

构造函数是显式的,因此您不会意外地将基础容器(例如vectordeque)传递给期望stack的函数,从而导致意外复制(而不是提到违反最小惊喜的原则。)

答案 1 :(得分:0)

一个问题是,如果你假设隐式调用,如果其他人遵循你的例子,会发生什么?因此,例如以下无法编译

#include <iostream>
#include <vector>
using namespace std;

class Test {
  public:

    Test(const std::vector<int>&) {
        cout << "Test(const std::Vector<int>&)" << endl;
    }
};
class AnotherTest {
  public:

    AnotherTest(const std::vector<int>&) {
        cout << "AnotherTest(const std::Vector<int>&)" << endl;
    }
};

void test_function(const AnotherTest&) {
    cout << "fucntion(const AnotherTest&)" << endl;
}
void test_function(const Test&) {
    cout << "fucntion(const Test&)" << endl;
}

int main() {
    const std::vector<int> vec {1, 2, 3};
    test_function(vec);

    return 0;
}

您可以使用stackqueue轻松查看此问题。