相关疑难解决方法(0)

Initializer-list-构造不可复制(但可移动)对象的向量

可以将push_back不可复制但可移动类型的rvalues转换为该类型的向量:

#include <vector>

struct S
{
    S(int);
    S(S&&);
};

int main()
{
    std::vector<S> v;
    v.push_back(S(1));
    v.push_back(S(2));
    v.push_back(S(3));
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试初始化列表构造具有相同rvalues的向量时,我得到关于所需的复制构造函数的错误:

#include <vector>

struct S
{
    S(int);
    S(S&&);
};

int main()
{
    std::vector<S> v = {S(1), S(2), S(3)};
}
Run Code Online (Sandbox Code Playgroud)

我在GCC 4.7中遇到以下错误:

In file included from include/c++/4.7.0/vector:63:0,
                 from test.cpp:1:
include/c++/4.7.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = S, _Args = {const S&}]':
include/c++/4.7.0/bits/stl_uninitialized.h:77:3:   required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const S*, _ForwardIterator = S*, …
Run Code Online (Sandbox Code Playgroud)

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

22
推荐指数
4
解决办法
3305
查看次数

std :: map <> ::使用不可复制对象和统一初始化插入

看看下面的代码:

#include <utility>
#include <map>

// non-copyable but movable
struct non_copyable {
    non_copyable() = default;

    non_copyable(non_copyable&&) = default;
    non_copyable& operator=(non_copyable&&) = default;

    // you shall not copy
    non_copyable(const non_copyable&) = delete;
    non_copyable& operator=(const non_copyable&) = delete;
};

int main() {
    std::map<int, non_copyable> map;
    //map.insert({ 1, non_copyable() });  < FAILS
    map.insert(std::make_pair(1, non_copyable()));
    // ^ same and works
}
Run Code Online (Sandbox Code Playgroud)

在取消注释g ++ 4.7上的标记行时,编译此代码段失败.产生的错误表明non_copyable无法复制,但我预计它会被移动.

为什么插入std::pair使用统一初始化的构造失败但没有使用构造std::make_pair?两者都不应该产生可以成功移入地图的右值吗?

c++ movable noncopyable c++11

12
推荐指数
1
解决办法
4386
查看次数

使用unique_ptr作为值初始化static std :: map

如何初始化静态地图,其中值是std::unique_ptr什么?

static void f()
{
    static std::map<int, std::unique_ptr<MyClass>> = {
        { 0, std::make_unique<MyClass>() }
    };
}
Run Code Online (Sandbox Code Playgroud)

当然这不起作用(std::unique_ptr删除copy-ctor ).

可能吗?

c++ initialization unique-ptr c++11

7
推荐指数
1
解决办法
1487
查看次数