在初始化列表中复制省略?

Copy elision in initializer list?

考虑这个class

class A {
public:
    tracker tra;
    A(tracker _t) : tra(_t) {}
};

并通过

调用
A a {tracker()};

tracker() 创建的对象在存储在 a.tra

之前永远不会被使用

为什么编译器不优化掉所有的复制结构?

.

跟踪器在此处定义:

class tracker {
public:
    void mark(const char* v) {
        std::cout << v << ' ' << this << std::endl;
    }

    tracker() {
        mark("con");
    }

    tracker(const tracker& o) {
        mark("cpy");
    }

    tracker(tracker&& o) {
        mark("mov");
    }

    ~tracker() {
        mark("des");
    }

    tracker& operator=(const tracker&) {
        mark("=cp");
        return *this;
    }

    tracker& operator=(tracker&&) {
        mark("=mv");
        return *this;
    }
};

因为标准不允许。 tracker 的复制构造函数在这里有可观察的 side-effect,这不是允许编译器执行复制省略而忽略可观察的 side-effect 的情况。 (cppreference)