相关疑难解决方法(0)

我可以列出 - 初始化只移动类型的向量吗?

如果我通过我的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是否正确尝试从初始化列表中复制指针?

c++ initializer-list move-semantics c++11

89
推荐指数
4
解决办法
1万
查看次数

我不能将'fill'std :: vector构造函数与unique_ptrs一起使用

我正在尝试使用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>

c++ vector unique-ptr

2
推荐指数
1
解决办法
192
查看次数