gpt4 book ai didi

c++ - 函数模板中的 is_const 总是返回 false

转载 作者:太空狗 更新时间:2023-10-29 20:28:10 25 4
gpt4 key购买 nike

是否可以将 is_const 表达式转换为 test 函数,或者这是不可能的,因为在模板类型推导过程中忽略了顶级 cv 限定符?

int main()
{
using std::is_const;

const int x = 0;
int y = 0;

// move to "bool test()"
std::cout
<< "main, x: " << is_const<decltype(x)>::value << "\n" // true
<< "main, y: " << is_const<decltype(y)>::value << "\n" // false
;

std::cout
<< "test, x: " << test(x) << "\n" // false, I wanted true
<< "test, y: " << test(y) << "\n" // false
;
}

我试过各种类似的版本都没有成功:

template<typename T>
bool test(T x)
{
return is_const<???>::value;
}

我想确保我没有遗漏任何东西,并且编写这样的 test 函数确实是不可能的。 (如果可能的话,我也想知道C++03版本是否可以。)

感谢您的考虑

更新

由于 Mankarse,我了解到在右值引用的情况下类型推导是不同的:

template<typename T> void t1(T x);
template<typename T> void t2(T& x);
template<typename T> void t3(T&& x);

const int x = 42;
int y = 0;

t1(x); // T = int: t1<int>(int x)
t1(y); // T = int: t1<int>(int x)

t2(x); // T = const int: t2<const int>(const int& x)
t2(y); // T = int: t2<int>(int& x)

t3(x); // T = const int&: t3<const int&>(const int& && x)
t3(y); // T = int&: t3<int&>(int& && x)

最佳答案

在 C++11 中,这可以通过完美转发右值引用来完成:

template<typename T>
bool test(T&& x)
{
return std::is_const<typename std::remove_reference<T>::type>::value;
}

在 C++03 中,您可以改用左值引用:

template<typename T>
bool test(T& x) {
return boost::is_const<T>::value;
}

两者的区别如下图所示:

typedef int const intc;
intc x = intc();
int y = int();
std::cout // C++11 C++03
<< "x: " << test(x) << "\n" // 1 1
<< "y: " << test(y) << "\n" // 0 0
<< "move(x): " << test(std::move(x)) << "\n"// 1 1 (when compiled as C++11)
<< "move(y): " << test(std::move(y)) << "\n"// 0 compilation error
<< "intc{}: " << test(intc()) << "\n" // 0 compilation error
<< "int{}: " << test(int()) << "\n" // 0 compilation error
;

关于c++ - 函数模板中的 is_const<func-param> 总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969877/

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