Я только что открыл следующую технику. Он очень близок к одному из предложенных синтаксисов концепций, отлично работает на Clang, GCC и MSVC.
template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;
template <typename T>
void foo(require_rvalue<T> val);
Я попытался найти его с поисковыми запросами вроде "sfinae в псевдониме типа" и ничего не получил. Есть ли название для этой техники и действительно ли язык позволяет это?
Полный пример:
#include <type_traits>
template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;
template <typename T>
void foo(require_rvalue<T>)
{
}
int main()
{
int i = 0;
const int ic = 0;
foo(i); // fail to compile, as desired
foo(ic); // fail to compile, as desired
foo(std::move(i)); // ok
foo(123); // ok
}