【发布时间】:2016-11-10 20:01:41
【问题描述】:
我在玩这个小sn-p:
#include <tuple>
struct copy_only
{
copy_only() = default;
copy_only(copy_only&&) = delete;
copy_only(const copy_only&) = default;
};
template <typename ...Ts>
void foo(Ts&& ...xs)
{
auto t = std::make_tuple(std::forward<Ts>(xs)...);
(void) t;
}
int main()
{
foo(copy_only{});
}
它可以与 gcc7 和 clang3.6、clang3.7、clang3.8 (Wandbox) 和 clang8.0 (macOS Sierra) 一起正常编译。它不能与 clang3.9、g++6.2 (macOS Sierra) 或 clang4.0 (Wandbox) 一起编译。他们都抱怨删除了移动构造函数。
它适用于仅移动类型。至少在 Wandbox 上可用的上述编译器上。
此代码是在 c++14 中将通用完美转发到元组的正确方法的示例吗?
【问题讨论】:
-
如果去掉
copy_only(copy_only&&) = delete;,就不会生成那个构造函数,可以选择复制重载。目前移动构造函数是一个更好的匹配。 -
@Jarod42 是正确的,但为什么它用 gcc 和旧的 clang 编译?
-
@kraz:在 c++1z 中,
auto t = ..会在不需要副本“存在”的情况下进行复制省略。 -
@Jarod42 感谢您的洞察力。我已经找到了解决方案(即仅在
std::is_move_constructible<Ts>::value == false时才呼叫前转)。但是我很好奇为什么上面的示例在可编译和不可编译之间切换,这是正确的 c++14:最新的 clang 或最新的 gcc。 -
@Jarod42 啊,现在说得通了
标签: c++ perfect-forwarding stdtuple