在初始化列表中复制省略?
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)
考虑这个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)