【发布时间】:2015-11-04 16:11:27
【问题描述】:
这是一个 C++ 测验的代码示例:
#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};
X f(X a) {
return a;
}
X g(const char * b) {
X c(b);
return c;
}
int main() {
f("hello");
g("hello");
}
程序的输出是什么?
我是这样想的:
-
调用
f(X a),构造函数隐式将const char*转换为X,所以输出为1 - 由于我们没有对象来存储返回值,所以返回值被丢弃,没有输出
-
g(const char*)被调用,X c(b)X(const char*)输出为 1 - 返回值再被丢弃一次 - 无输出
所以答案是 11。测验的答案是 131。我用 g++ 4.4.4-13 得到的答案是 121。
据说这段代码是用这个命令编译的:
g++ -std=c++11 -Wall -Wextra -O -pthread
中间的数字从何而来?为什么会是 3 或 2?
【问题讨论】:
-
复制省略 (en.cppreference.com/w/cpp/language/copy_elision) 不是强制性的。您不能依赖此优化。所以 return 语句输出什么都不能依赖。
-
谁写了这个作为“测验”?这个程序可以有效地打印四种不同的输出。
-
@T.C.这是 ACCU 2014 年的 C++ pub quiz
-
不要忘记 gcc 4.4 是 2009 年的编译器,所以还没有隐式返回。
-
gcc 4.4 怎么能接受
-std=c++11?它唯一知道的是-std=c++0x。
标签: c++ c++11 move-semantics