有没有办法在运行时识别变量的const修饰符?

时间:2014-01-28 12:53:15

标签: c++ rtti

我的意思是以下问题。 然后我尝试使用const库知道typeinfo指针的类型和恒定性,我们得到它们:

int* pY1 = 0;
const int* pY2 = 0;
std::cout << "pY1: " << typeid(pY1).name() << std::endl;
std::cout << "pY2: " << typeid(pY2).name() << std::endl;

输出:

pY1: int *
pY2: int const *

但接下来我尝试以下

int x1 = 0;
const int x2 = 0;   
std::cout << " x1: " << typeid(x1).name() << std::endl;
std::cout << " x2: " << typeid(x2).name() << std::endl;

输出

x1: int
x2: int

ideone code
是否可以在运行时识别常量?如果是的话,怎么做?

3 个答案:

答案 0 :(得分:10)

如果您使用的是C ++ 11,则根本不需要rtti,您可以使用std::is_const示例:

int x1 = 0;
const int x2 = 0;
bool is_x1_const = std::is_const<decltype(x1)>::value;
bool is_x2_const = std::is_const<decltype(x2)>::value;

旧C ++版本:

template<typename T> bool is_const(T) { return false;}
template<typename T> bool is_const(const T) { return true;}

答案 1 :(得分:4)

拿地址,然后你回到你的工作案例:

int x1 = 0;
const int x2 = 0;
std::cout << " x1: " << typeid(&x1).name( ) << std::endl;
std::cout << " x2: " << typeid(&x2).name( ) << std::endl;

答案 2 :(得分:1)

在运行时,没有constness的概念。这是仅在编译时使用的东西,它为您提供了比您想象的更早知道const的好处。

如果您没有std::is_const可用的C ++ 11,您仍然可以复制实现并使用模板特化来推断常量。有关示例实现,请参阅http://en.cppreference.com/w/cpp/types/is_const

template<class T> struct is_const          : std::false_type {};
template<class T> struct is_const<const T> : std::true_type {};

您可以使用函数而不是类型执行类似的操作,但是会丢失逻辑的编译时方面。