C ++ 11标准中的哪个子句允许我在下面的`A :: operator - ()`中的`return`语句中消除`A`?

时间:2014-01-18 22:21:20

标签: c++ c++11 constructor

C ++ 11标准中的哪个子句允许我删除下面Areturn语句中的A::operator-()?换句话说,如果我将表达式return A{-a.i, -a.j};替换为return {-a.i, -a.j};,则代码会正确编译并执行。如果可能的话,我想知道如何使用标准?

#include <iostream>

struct A {
    int i;
    int j;
    A(int n, int m) : i(n), j(m) {}
};


A operator-(A a) { return A{-a.i, -a.j}; }

int main()
{
    A a(1, 2);
    A b = -a;
    std::cout << b.i << "  " << b.j << '\n';
}

2 个答案:

答案 0 :(得分:10)

6.6.3 / 2

  

带有 braced-init-list 的return语句通过copy-list-initialization(8.5.4)从指定的初始化程序初始化要从函数返回的对象或引用   名单。 [示例:

    std::pair<std::string,int> f(const char* p, int x) {
      return {p,x};
    }
     

- 结束示例]

答案 1 :(得分:2)

这在第8.5.4节“C ++标准的列表初始化”

的第3段中有描述
  

- 否则,如果T是类类型,则考虑构造函数。该   列举了适用的构造函数,并选择最佳构造函数   通过重载决议(13.3,13.3.1.7)。如果缩小   转换(见下文)是转换任何参数所必需的,   该计划格式不正确。

下面有一个例子

struct S {
// no initializer-list constructors
S(int, double, double); // #1
S(); // #2
// ...
};
S s1 = { 1, 2, 3.0 }; // OK: invoke #1
S s2 { 1.0, 2, 3 }; // error: narrowing
S s3 { }; // OK: invoke #2