相关疑难解决方法(0)

显式复制构造函数和统一初始化

显式复制构造函数不允许使用类似的东西Foo foo = bar;,并强制执行复制用法Foo foo(bar);.此外,显式复制构造函数还禁止通过函数的值返回对象.但是,我尝试用大括号替换副本初始化,就像这样

struct Foo
{
    Foo() = default;
    explicit Foo(const Foo&) = default;
};

int main()
{
    Foo bar;
    Foo foo{bar}; // error here
}
Run Code Online (Sandbox Code Playgroud)

我收到了错误(g ++ 5.2)

错误:没有匹配函数来调用'Foo :: Foo(Foo&)'

或(clang ++)

错误:struct initializer中的多余元素

删除explicit使得代码在g ++下可编译,clang ++仍然失败并出现相同的错误(感谢@Steephen).这里发生了什么?统一初始化是否被视为初始化列表构造函数(胜过所有其他构建函数)?但如果是这种情况,为什么程序在复制构造函数非显式时编译?

c++ copy-constructor language-lawyer uniform-initialization c++11

25
推荐指数
1
解决办法
1340
查看次数

当parens初始化时,为什么构造函数初始化列表中的C++ 11大括号初始化不起作用?

初始化对抽象类型的引用时,构造函数初始化列表中的{}初始化如何与()初始化不同?以下课程栏:

class AbstractBase
{
public:
    AbstractBase() {}
    virtual ~AbstractBase() = default;

    virtual void ab() = 0;
};

class Foo : public AbstractBase
{
public:
    Foo() {}

    void ab() {}
};

class Bar
{
public:
    Bar(const AbstractBase& base) : myBase{base} {}

private:
    const AbstractBase& myBase;
};


int main()
{
    Foo f{};
    Bar b{f};

}
Run Code Online (Sandbox Code Playgroud)

编译时,我收到错误

test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&)’:
test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
     Bar(const AbstractBase& base) : myBase{base}
                                                ^
test5.cpp:2:7: note:   because the following …
Run Code Online (Sandbox Code Playgroud)

c++ initialization reference c++11 list-initialization

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

struct initializer中的元素太多

为什么这段代码会出错而不是调用move-constructor?

struct A
{
};

int main()
{
    A a{A()}; // error: too many initializers for 'A'
}
Run Code Online (Sandbox Code Playgroud)

演示:http://coliru.stacked-crooked.com/a/ce822fcbda0f7db9

我是否可以使用统一初始化调用聚合上的构造函数?

c++

5
推荐指数
0
解决办法
81
查看次数