【发布时间】:2018-07-05 23:05:25
【问题描述】:
我有一些这样的代码:
struct Data {
Data(const std::vector<int> &data = {}) : data_(data) {}
const std::vector<int> &data_;
};
Data create1() {
return Data(); // bad
}
Data create2() {
return Data({}); // bad
}
Data create3(const std::vector<int> &data = {}) {
return Data(data); // good
}
Data create4() {
static const std::vector<int> data;
return Data(data); // good
}
void main() {
auto data1 = create1(); // deleted data_
auto data2 = create2(); // deleted data_
auto data3 = create3(); // ok
auto data4 = create4(); // ok
}
四个创建函数在我看来是一样的。但是为什么 create1 和 create2 会导致删除 data_ 而 create3 和 create4 都可以呢?
【问题讨论】:
-
您正在存储对临时的引用。那是不行的。将您的构造函数更改为
Data(std::vector<int>& data);以避免这种情况。 -
什么是
void main()? -
在标准 C++ 中非法,@scohe001,但我很确定你知道这一点。
-
@alter igel 但是为什么不将 create3 视为临时对象?
标签: c++ reference default-arguments