gpt4 book ai didi

c++ - add_const 不适用于转发引用

转载 作者:行者123 更新时间:2023-11-27 22:53:26 27 4
gpt4 key购买 nike

我正在使用 add_const typetrait 在应用于转发引用类型的场景中。一切看起来都没有 constness 被添加到类型中,所以我做了一个小例子来验证情况是否如此( PrintType 是一个不完整的类型,会导致编译错误,迫使编译器吐出模板参数的名称错误信息):

#include <iostream>
#include <type_traits>
#include <complex>


template <class T>
struct PrintType;

template <class T>
void f(T&& arg)
{
PrintType<std::add_const_t<decltype(arg)>> local;
(void)local;
}


int main()
{
std::complex<double> co;
f(co);
}

错误信息says :

main.cpp: In instantiation of 'void f(T&&) [with T = std::complex<double>&]':

main.cpp:20:9: required from here

main.cpp:12:48: error: 'PrintType<std::complex<double>&> local' has incomplete type

PrintType<std::add_const_t<decltype(arg)>> local;

即特征将我的类型转换为 T = std::complex<double>&而不是 T = std::complex<double> const&

最佳答案

类型特征按预期工作。您应该考虑您正在尝试做什么,即向引用添加常量。 你不能重新绑定(bind)一个引用(它不是可变的),所以本质上任何引用都是一个const引用

T& == T& const

我想你希望做的是创建一个对 const 类型的引用(这让我想起了 const iterator vs const_iterator 东西),这是做不到的这样,出于同样的原因,您不能通过这种方式将 reference 类型定义为 对 const 类型的引用:

typedef T& ref_t;
typedef const ref_t const_ref_t; // This is not T const& !!

综上所述,将 const 添加到引用类型使其成为 const 引用(与引用相同)而不是对 const 类型的引用

关于c++ - add_const 不适用于转发引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35316312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com