【发布时间】:2018-09-17 04:58:21
【问题描述】:
考虑以下程序:
#include <iostream>
#include <utility>
class T {
public:
T() { printf("address at construction: %zx\n", (uintptr_t)this); }
// T(const T&) { printf("copy-constructed\n"); } // helps
// T(T&&) { printf("move-constructed\n"); } // helps
// T(const T&) = default; // does not help
// T(T&&) = default; // does not help
};
T f() { return T(); }
int main() {
T x = f();
printf("address after construction: %zx\n", (uintptr_t)&x);
return 0;
}
使用g++ -std=c++17 test.cpp 编译会得到以下输出(与clang++ 相同):
address at construction: 7ffcc7626857
address after construction: 7ffcc7626887
基于C++ reference,我希望程序输出两个相等的地址,因为应该保证复制/移动被忽略(至少在 C++17 中)。
如果我明确定义了复制或移动构造函数或两者(参见示例中注释掉的行),程序会给出预期的输出(即使使用 C++11):
address at construction: 7ffff4be4547
address after construction: 7ffff4be4547
简单地将复制/移动构造函数设置为default 没有帮助。
引用明确说明
[复制/移动构造函数]不需要存在或可访问
那么我在这里错过了什么?
【问题讨论】:
标签: c++ c++17 copy-constructor move-semantics copy-elision