相关疑难解决方法(0)

复制初始化和直接初始化之间有区别吗?

假设我有这个功能:

void my_test()
{
    A a1 = A_factory_func();
    A a2(A_factory_func());

    double b1 = 0.5;
    double b2(0.5);

    A c1;
    A c2 = A();
    A c3(A());
}
Run Code Online (Sandbox Code Playgroud)

在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?

我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.

c++ initialization

230
推荐指数
5
解决办法
5万
查看次数

c ++ 11列表初始化的不同行为

请考虑以下代码:

class A {
private:
  std::string s;
public:
  A() = delete;
  A(const A&) = delete;
  A(A&&) = delete;
  A(const std::string &a) : s(a) {}
};
Run Code Online (Sandbox Code Playgroud)

现在,我想初始化一个使用列表初始化的A数组.g ++(4.9.1)可以成功构建以下代码:

int main() {
  A arr[2] = {{"a"}, {"b"}};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,它失败了以下代码:

class Aggr {
private:
  A arr[2];
public:
  Aggr() : arr{{"a"}, {"b"}} {}
};
Run Code Online (Sandbox Code Playgroud)

错误消息是,

test.cc: In constructor ‘Aggr::Aggr()’:
test.cc:22:28: error: use of deleted function ‘A::A(A&&)’
   Aggr() : arr{{"a"}, {"b"}} {}
                            ^          
test.cc:11:3: note: declared here
   A(A&&) = delete;
   ^
Run Code Online (Sandbox Code Playgroud)

也就是说,list-initializer尝试调用move构造函数来初始化类中的数组.但是,该代码是由clang v3.5成功构建的,没有任何警告.所以,我想知道C++ …

c++ c++11 list-initialization

13
推荐指数
1
解决办法
286
查看次数

没有默认构造函数和已删除的复制构造函数初始化的对象的类成员数组

我有一个名为'Container'的类,其中必须存储三个(在编译时已知)DontCopyMe类的对象.DontCopyMe类具有非默认构造函数和已删除的复制构造函数.如何初始化Containter?

示例代码:

#include <string>

class DontCopyMe
{
    public:
        DontCopyMe(const unsigned int SomeInt, const std::string & SomeString): SomeInt(SomeInt), SomeString(SomeString)
        {
        }
        DontCopyMe(const DontCopyMe &) = delete;
        DontCopyMe & operator = (const DontCopyMe &) = delete;
        DontCopyMe(DontCopyMe &&) = delete;
        DontCopyMe & operator = (DontCopyMe &&) = delete;

    private:
        const unsigned int SomeInt;
        const std::string SomeString;
};

class Container
{
    public:
        Container(): Array{{1, "A"}, {2, "B"}, {3, "C"}}
        {

        }

    private:
        DontCopyMe Array[3];
};

int main()
{
    Container C;
    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

3
推荐指数
1
解决办法
996
查看次数

标签 统计

c++ ×3

c++11 ×2

initialization ×1

list-initialization ×1