gpt4 book ai didi

c++ - 自动模板推导中的常量正确性

转载 作者:行者123 更新时间:2023-12-01 14:43:48 25 4
gpt4 key购买 nike

在下面的示例中,我希望a.foo(j);行将const限定符传递给模板化方法。

#include <iostream>
#include <type_traits>

struct A
{
template<typename T>
void foo(T i) const
{
std::cout << "Is const type: " << std::is_const<T>::value << "\n";
}
};

int main() {

A a;

int i = 0;
const int j = 0;

a.foo(i);
a.foo(j);

a.foo<decltype(i)>(i);
a.foo<decltype(j)>(j);

a.foo<int>(i);
a.foo<const int>(j);

return 0;
}

但是我从gcc和clang(c++ 17)获得的输出如下。
Is const type: 0
Is const type: 0
Is const type: 0
Is const type: 1
Is const type: 0
Is const type: 1

第二行是false而不是true。那么,为什么自动模板推导丢弃简历限定符?发生这种情况有什么具体原因吗?

PS。上面的例子可以找到 here

最佳答案

T类型的推论将始终被推论。 int const的衰减类型只是intint[3]的衰减类型为int*

关键是,此代码是const正确的。

是的,在foo中,您永远无法更改j的值。在foo内部,您有一个副本,由foo决定是否希望自己的参数在函数体内恒定。

但是,还有其他形式的推论,必须保持const可以与参数一起调用。这不是您的代码的解决方案,而只是一个示例:

template<typename T>
void frob(T& i)
{
std::cout << "Will it be const? " << std::is_const<T>::value << "\n";
}

auto main() -> int {
int const myInt = 9;
frob(myInt);
}

要完全被调用,参数必须是 int const&,这就是要推导的内容。

关于c++ - 自动模板推导中的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59397717/

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