【发布时间】:2018-10-25 18:15:10
【问题描述】:
也许这段代码最能说明我的意图:
#include <array>
template <size_t N>
void f(std::array<char, N> arr)
{
}
template <size_t N>
void f(std::array<char, N>&& arr)
{
static_assert(false, "This function may not be called with a temporary.");
}
f() 应该为左值而不是右值编译。此代码适用于 MSVC,但 GCC 会在 static_assert 上跳闸,即使从未调用过此重载。
所以我的问题有两个:如何用现代 C++ 正确表达我的意图,以及为什么编译器在从未实例化的“死”模板重载中评估 static_assert?
【问题讨论】:
-
这不会导致警告而是硬错误。
-
你想让
arr在函数中是可修改的吗? -
FWIW,禁止右值并没有真正起作用。 Titus Winters 给出了a talk at C++Now 并在 CppCon(现代 C++ 设计)的一次演讲中提到了这一点。简而言之,右值不是生命周期的指标。禁用右值重载将导致程序员简单地将临时变量放入局部变量中,这不会真正影响生命周期要求
-
@NathanOliver:不,这不是必需的。你有什么想法?
-
@Justin:在我的情况下,除了局部变量完全没问题,但使用临时调用
f会出现段错误或产生垃圾。
标签: c++ templates c++14 c++17 rvalue