了解 declval 在copy_assignment情况下的工作方式
Understanding how declval is working in the copy_assignment situation
我正在看Walter E. Brown博士的模板元编程演讲。在他的演讲中,他为is_copy_assignable
提供了这样的代码:
template<class U, class = decltype(declval<U&>() = declval<U const&>())>
static true_type try_assignment(U &&);
我遇到的问题是在这种情况下如何调用赋值运算符。当我尝试对这段代码进行推理并说替换虚拟类型时,请说int
,代替我得到的U
:
template<class U, class = decltype(declval<int&>() = declval<int const&>())>
template<class U, class = decltype(int& = int const&)>
所以我想知道这如何帮助我们确定赋值运算符是否有效。如果我理解正确declval
这段代码甚至不会计算,那么如何从int& = int const&
中确定,它甚至不计算,是否有为U
定义赋值运算符。
我知道在大多数情况下,复制赋值运算符将被定义为
C& operator=(const C& other)
这看起来很像上面的内容,但仍然因为没有评估任何内容,那么这些信息有什么用。
我并没有真正按照您的意图执行以下步骤:
template<class U, class = decltype(declval<int&>() = declval<int const&>())>
template<class U, class = decltype(int& = int const&)>
declval
说:假装返回模板参数类型的值。我说假装是因为函数没有真正定义,只是声明,所以它只能在未计算的上下文中使用。decltype
内部是未计算的上下文,因为您只检查类型。
所以,表达式decltype(declval<int&>() = declval<int const&>())
基本上是说:如果我有一个int&
,叫它x
,我有一个int const&
,叫它y
,表达式x = y
的类型是什么?
正如您可能猜到的那样,这将调用赋值运算符,并且此表达式将具有有效的类型(在本例中为int&
)。如果将int
更改为unique_ptr
,则此表达式将没有有效的类型,因为unique_ptr
不可分配,从而导致类型替换失败,并从重载或专用化集中消除此模板。
之所以有declval,是因为它允许你创建任何类型的值;这对于a)创建引用类型的东西和b)创建非引用类型而不假设它们具有默认构造函数特别有用。因此,declval
的使用在高质量TMP中非常普遍。
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么它在不分配内存的情况下工作正常
- 此函数如何在不传递任何参数的情况下工作?
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 为什么Arduino(小端序)上的Sha1在没有转换为大端序的情况下工作?
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- OpenMP程序在没有关键部分的情况下工作
- EM_SETHANDLE,EM_GETHANDLE在没有DS_LOCALEDIT的情况下工作
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 斯芬克斯在没有数据库的情况下工作吗
- pow()函数在没有任何数学库的情况下工作
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 共享指针在未分配的情况下工作
- 为什么boost this_thread::interrupt可以在没有try-catch的情况下工作
- SDL如何在没有源文件的情况下工作
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 子进程中的Execl仅在特定情况下工作
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
- Visual c++ /MFC:让日文字符在没有UNICODE的情况下工作