首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++语言在使用列表初始化时是否强制编译器优化?

C++语言在使用列表初始化时是否强制编译器优化?
EN

Stack Overflow用户
提问于 2016-08-04 01:26:47
回答 1查看 143关注 0票数 3

这是source.cpp

代码语言:javascript
复制
#include <iostream>

struct A {
    A(int i) : i(i) { std::cout << this << ": A(int)" << std::endl; }
    A(A const &a) : i(a.i) { std::cout << this << ": A(A const &)" << std::endl; }
    A(A &&a) : i(a.i) { std::cout << this << ": A(A &&)" << std::endl; }
    ~A() { std::cout << this << ": ~A()" << std::endl; }    

  private:
    int i;
};    

int main() {
    std::cout << "#1 :" << std::endl;
    A a1 = 1; // #1, copy-initialization    

    std::cout << "#2 :" << std::endl;
    A a3(1); // #2, direct-initialization    

    std::cout << "#3 :" << std::endl;
    A a4 = {1}; // #3, copy-list-initialization    

    std::cout << "#4 :" << std::endl;
    A a5{1}; // #4, direct-list-initialization    

    std::cout << std::endl;
    return 0;
}

clang++ -std=c++14 -Wall -fno-elide-constructors -pedantic -o main.exe source.cpp编译上述代码(这里,我禁用了结构优化。顺便说一下,我用的是Clang 3.8.1)。然后,我得到以下输出:

代码语言:javascript
复制
#1 :
0x61fe40: A(int)
0x61fe48: A(A &&)
0x61fe40: ~A()
#2 :
0x61fe30: A(int)
#3 :
0x61fe28: A(int)
#4 :
0x61fe20: A(int)

0x61fe20: ~A()
0x61fe28: ~A()
0x61fe30: ~A()
0x61fe48: ~A()

让我惊讶的是,#3并不像#1那样先调用A::A(int),然后调用A::A(A &&),尽管它们都是复制初始化的。我还用gcc 6.1.0测试了它。同样的事也会发生。据我所知,列表初始化的一个常见用法是禁止缩小转换。我不知道它与编译优化有任何关系。所以,

C++语言是在使用列表初始化时强制编译器优化,还是只是编译器更喜欢这样做,或者是其他什么原因导致了上面描述的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 02:00:50

在这种情况下,直接和复制列表初始化都会导致对构造函数的调用。

使用dcl.init.list / 3中规则中的消去过程,

列表-对象的初始化或T类型的引用定义如下: ..。 否则,如果T是类类型,则考虑构造函数。列举了适用的构造函数,并通过过载解析(13.3,13.3.1.7)选择了最优的构造函数。如果需要收缩转换(见下文)来转换任何参数,则程序的格式是错误的。

重要的是,复制初始化和复制列表初始化不是等价的,您可以使用复制列表初始化来使用删除的复制初始化对象并移动构造函数,例如:

代码语言:javascript
复制
struct A
{
  A(int i){}
  A(A const&) =delete;
  A(A&&) =delete;
};    

int main()
{
  A a1 = {1};
  A a2 = 1; // won't compile
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38757079

复制
相关文章

相似问题

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