我正在观看 Walter Brown 在 CppCon 2014 'Modern Template Metaprogramming: A Compendium' 上的演讲。在第二部分中,他通过 is_copy_assignable 的示例实现演示了 decltype 和 declval 的用法。
这是视频的链接,带有幻灯片,显示了源代码(如果你想听听他的解释,请倒带一点):https ://youtu.be/a0FliKwcwXE?t=1576
在这里,我在示例程序中输入了他的实现:
#include <iostream>
#include <type_traits>
#include <mutex>
using namespace std;
template <class T>
struct my_is_copy_assignable {
private:
template<class U, class = decltype(declval<U&>() = declval<U const&>())>
static true_type try_assignment(U&&); // Why U&& and not for example U?
static false_type try_assignment(...);
public:
using type = decltype( try_assignment( declval<T>() ) );
};
int main()
{
cout << "Is mutex copy assignable: "
<< my_is_copy_assignable<mutex>::type() << endl
<< "Is int copy assignable: "
<< my_is_copy_assignable<int>::type() << endl;
return 0;
}
我的问题是关于函数模板(评论的):
static true_type try_assignment(U&&);
为什么他使用右值引用?我尝试使用左值引用甚至按值传递参数,它似乎有效。
我在这里缺少什么?