Возможно, этот фрагмент кода лучше всего проиллюстрирует мои намерения:
#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()
должен компилироваться для lvalues, но не для rvalues.Этот код работает с MSVC, но GCC срабатывает на static_assert
, хотя эта перегрузка никогда не вызывается.
Так что мой вопрос двоякий: как правильно выразить свои намерения с помощью современного C ++ и почемукомпилятор оценивает static_assert
в «мертвой» перегрузке шаблона, которая никогда не создавалась?
Попробуйте онлайн: https://godbolt.org/z/yJJn7_