首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宾语结构中使用"=“的效果

宾语结构中使用"=“的效果
EN

Stack Overflow用户
提问于 2016-07-17 09:34:38
回答 1查看 189关注 0票数 2

另一个C++问题,我试图弄清楚在构造对象时使用"=“会产生什么影响。考虑:

代码语言:javascript
复制
class Foo {
    private:
        int bar;
        int baz;

    public:
        Foo(int bar, int baz)
            :bar(bar), baz(baz) {}
};

int main() {
    Foo foo1{4, 2};
    Foo foo2 = {4, 2};
    Foo foo3 = Foo{4, 2}; // I prefer this one for aesthetic reasons.

    return 0;
}

有什么不同之处,我应该坚持哪一个作为最佳实践?

此外,当我们讨论最佳实践时,我听说在构造函数中添加explicit是个好主意,因为™具有隐式转换的奇怪行为。因此,我将explicit添加到Foo的构造函数中。

代码语言:javascript
复制
    public:
        explicit Foo(int bar, int baz)
            :bar(bar), baz(baz) {}

突然之间,这个:

代码语言:javascript
复制
    Foo foo2 = {4, 2};

无法使用错误进行编译:

代码语言:javascript
复制
error: chosen constructor is explicit in copy-initialization

为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-17 09:44:59

有什么不同? Foo foo1{4,2};

我是直接初始化(2)

在下列情况下执行直接初始化: 2)在列表初始化过程中,如果没有提供初始化器-列表构造函数,并且可以访问匹配的构造函数,那么所有必要的隐式转换都是不收窄的。

Foo foo2 = {4,2};

我是复制列表初始化(6)。对于非直接列表初始化,不考虑显式构造函数。这解释了为什么当您显式地更改构造函数时,程序没有编译。

复制列表初始化(只能调用非显式构造函数) 6)在等号之后用大括号初始化命名变量。

Foo foo3 = Foo{4,2};

这是一个临时对象的直接列表初始化(2),然后是来自临时对象的复制初始化(1)

直接列表初始化(同时考虑显式和非显式构造函数) 2)初始化带有大括号的未命名临时表。

在下列情况下执行副本初始化:

2)当非引用类型T的命名变量(自动、静态或线程局部)被声明时,初始化器由一个等号组成,后面跟着一个表达式。

首先是最简单的,这也是我喜欢的原因。

第二个构造函数需要一个隐式构造函数,但在其他情况下是可以的。

第三种是重复类型(违反干的),并构造一个不必要的临时(实际上,该副本可能被优化器删除,但该类型必须是可复制的)。

我听说向构造函数添加显式是一个好主意,™。因此,我将显式添加到Foo的构造函数中。

如果要防止隐式转换,向单个参数构造函数添加显式是一个好主意。对于两个参数构造器来说,显式并不是普遍有用的,但我不怀疑在某些情况下您会需要它。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38419830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档