从函数返回大括号初始值设定项列表:它编译成什么?

Tus*_*eja 7 c++ initializer-list

例如,这是一小段代码。

#include <iostream>

struct coordinate {
    int x, y;
};

coordinate shift(coordinate p, int offset) {
    return {p.x + offset, p.y + offset};
}

int main(int argc, char *argv[]) {
    coordinate p {1, 2};
    coordinate p_s = shift(p, 3);
    std::cout << "x: " << p_s.x << "\ty: " << p_s.y;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在函数中shift,我们看到 return 语句似乎返回一个初始值设定项列表。

虽然我理解这在语义上意味着什么,但我希望确认我是否理解它的编译结果。

编译器是否将shift函数解释为这样?

shift(coordinate p, int offset) {
    coordinate p_ {p.x + offset, p.y + offset};
    return p_;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,那又如何呢?

感谢您的帮助。

ric*_*ici 9

它是相似的,尽管将等价编写为构造函数表达式似乎更自然:

 return coordinate{p.x + offset, p.y + offset};
Run Code Online (Sandbox Code Playgroud)

这很明显表明它只不过是语法糖而已。也就是说,它不返回初始值设定项列表,而是返回使用花括号初始化列表语法构造的指定类型的新对象。

请注意,复制省略适用,因此当将返回值分配给新构造的 时,将不会构造coordinate中间体(或者在较旧的 C++ 版本中可能不会构造)。coordinate


Jts*_*Jts 5

您没有返回“花括号”初始值设定项列表,而是返回使用花括号初始值设定项列表构造的结构,这是一个临时对象,因此 RVO 将适用。

没什么好担心的。

  • 非常感谢您的回答。我想投票赞成它,但 SO 认为我太新了,无法开始这样做。 (2认同)
  • 你的客气话就足够了:) (2认同)