【发布时间】:2018-08-28 01:37:47
【问题描述】:
我刚刚发现了以下技术。它看起来非常接近提议的概念语法之一,在 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 in type alias”之类的搜索请求找到它,但什么也没得到。这种技术有名字吗?语言真的允许吗?
完整示例:
#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
}
【问题讨论】:
-
好问题!我也没见过。 Looks very cool, though.
标签: c++ c++11 language-lawyer sfinae