Copy elision for pass-by-value arguments

前端 未结 4 785
渐次进展
渐次进展 2020-12-17 09:09

Given

struct Range{
    Range(double from, double to) : from(from), to(to) {}
    double from;
    double to;
};

struct Box{
    Box(Range x, Range y) : x(x         


        
4条回答
  •  死守一世寂寞
    2020-12-17 09:41

    It should, but I fail to make it work (live example). The compiler may detect the side-effect of the constructors and decide not to go with copy elision.

    #include 
    
    struct Range{
        Range(double from, double to) : from(from), to(to) { std::cout << "Range(double,double)" << std::endl; }
        Range(const Range& other) : from(other.from), to(other.to) { std::cout << "Range(const Range&)" << std::endl; }
        double from;
        double to;
    };
    
    struct Box{
        Box(Range x, Range y) : x(x), y(y) { std::cout << "Box(Range,Range)" << std::endl; }
        Box(const Box& other) : x(other.x), y(other.y) { std::cout << "Box(const Box&)" << std::endl; }
        Range x;
        Range y;
    };
    
    
    int main(int argc, char** argv)
    {
        (void) argv;
        const Box box(Range(argc, 1.0), Range(0.0, 2.0));
        std::cout << box.x.from << std::endl;
        return 0;
    }
    

    Compile & run:

    clang++ -std=c++14 -O3 -Wall -Wextra -pedantic -Werror -pthread main.cpp && ./a.out
    

    Output:

    Range(double,double)
    Range(double,double)
    Range(const Range&)
    Range(const Range&)
    Box(Range,Range)
    1
    

提交回复
热议问题