如果我通过我的GCC 4.7快照传递以下代码,它会尝试将unique_ptrs 复制到向量中.
#include <vector>
#include <memory>
int main() {
using move_only = std::unique_ptr<int>;
std::vector<move_only> v { move_only(), move_only(), move_only() };
}
Run Code Online (Sandbox Code Playgroud)
显然,因为std::unique_ptr不可复制而无法工作:
错误:使用已删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp,_Dp> = std :: unique_ptr]'
GCC是否正确尝试从初始化列表中复制指针?
我正在尝试使用std :: vector构造函数的"填充"版本.它将元素的数量作为第一个参数,将const value_type&作为第二个参数:
#include <vector>
int main()
{
std::vector<int> v(100, 7);
// Works, creates vector with 100 elements of int 7.
}
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法使用unique_ptrs:
#include <vector>
#include <memory>
int main()
{
std::vector<std::unique_ptr<int>> v1(100, std::unique_ptr<int>());
std::vector<std::unique_ptr<int>> v2(100, std::make_unique<int>());
}
Run Code Online (Sandbox Code Playgroud)
两者都不适用于unique_ptrs.我从Visual Studio 2017得到的错误是:
错误C2280'std :: unique_ptr> :: unique_ptr(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':尝试引用已删除的函数
考虑到第二个参数采用const引用包含在向量中的类型,我期望std :: unique_ptr()或std :: make_unique()只是作为第二个参数.我知道他们都是临时工,但看到参数是const引用,它应该接受它,为什么它接受它接受整数7为我的第一个例子中的参数有效.
此外,std :: unique_ptr()看起来非常接近"最令人烦恼的解析",但cppreference.com上的示例使用它:
// Use the default constructor.
std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
Run Code Online (Sandbox Code Playgroud)
正如我所说,这看起来像"最烦恼的解析",是一个不带参数的函数的函数签名,并返回一个std :: unique_ptr <Vec3>