【发布时间】:2014-07-24 04:27:32
【问题描述】:
为什么在具有通用引用参数的构造函数的类中不会发生右值优化?
http://coliru.stacked-crooked.com/a/672f10c129fe29a0
#include <iostream>
template<class ...ArgsIn>
struct C {
template<class ...Args>
C(Args&& ... args) {std::cout << "Ctr\n";} // rvo occurs without &&
~C(){std::cout << "Dstr\n";}
};
template<class ...Args>
auto f(Args ... args) {
int i = 1;
return C<>(i, i, i);
}
int main() {
auto obj = f();
}
输出:
Ctr
Ctr
Dstr
Ctr
Dstr
Dstr
【问题讨论】:
-
Universal reference 是一个特定作者创造的术语,但其他人不同意……我个人认为它造成的混乱多于帮助,您应该尝试了解如何类型推断有效,因为这是这里问题的答案。
-
使用 g++ 4.8.3 我得到
CtrDstr对于C(Args... args)和C(Args &&... args)。你的编译器和版本(和标志)是什么? -
@MattMcNabb "g++ -std=c++1y -O3 -Winline -Wextra -pthread -pedantic-errors" 4.9 版。 GCC 4.8.1 也不做 rvo coliru.stacked-crooked.com/a/d2ddb81f9ed2d217
-
@MattMcNabb:
auto f() {是(将是)合法的 C++14,一些编译器已经支持它。 -
@DavidRodriguez 为移动构造函数启用
cout,我仍然只得到CtrDstr两个版本。 (添加-fno-elide-constructors得到CtrmoveDstrmoveDstrDstr)
标签: c++ templates rvalue-reference rvo universal-reference