从函数返回一个支撑的初始化列表:它编译成什么?

时间:2016-02-06 17:06:37

标签: 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;
}

在函数shift中,我们看到return语句似乎正在返回初始化列表。

虽然我理解这意味着语义,但我想确认我是否理解它的编译方式。

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

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

如果没有,那怎么样?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

 return coordinate{p.x + offset, p.y + offset};

这显然它不仅仅是语法糖。也就是说,它不返回初始化列表,而是返回使用braced-init-list语法构造的指定类型的新对象。

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

答案 1 :(得分:0)

我可能错了,但是...... shift()会返回一个临时coordinate,然后p_s会从该临时坐标进行复制构建。

(但是,大多数编译器可能会跳过中间人,并传递隐藏的引用,以便shift()直接构造p_s,我相信。)

答案 2 :(得分:0)

您没有返回“支撑”初始值设定项列表,而是返回使用支撑初始值设定项列表构建的struc,这是一个临时对象,因此将应用RVO。

没什么可担心的。