使用"const"关键字进行C类型转换

Cre*_*ing 5 c c++ casting const

我通常在C/C++代码中使用C类型转换.我的问题是,在构建类型中添加"const"关键字是否意味着结果的任何内容?

例如,我可以想出几个场景:

const my_struct *func1()
{
   my_struct *my_ptr = new my_struct;

   // modify member variables

   return (const my_struct *)my_ptr;
   // return my_instance;
}
Run Code Online (Sandbox Code Playgroud)

在这一个中,该函数构造一个struct的新实例,并将其转换为常量指针,因此除了删除它之外,调用者将无法进一步修改其内部状态.是"const"转换是必需的,推荐的还是简单的不必要的,因为任何一个return语句都有效.

在这一个中,my_base是基类my_derive.

const my_base *func2(const my_derive *my_ptr)
{
    return (const my_base *)my_ptr;
    // return (my_base *)my_ptr;
}
Run Code Online (Sandbox Code Playgroud)

因为my_ptr已经是一个const指针,所以会在转换时使用(my_base *)const_cast来删除const和另一个隐式const_cast吗?

是否有任何理由将"const"添加到整数函数参数中,因为更改它永远不会影响函数外的状态?

void func3(const int i)
{
    // i = 0; is not allowed, but why, as it is harmless?
}
Run Code Online (Sandbox Code Playgroud)

如何在转换整数时添加"const"?我觉得这应该很像func2().

void func4(short i)
{
    const unsigned int j = (const unsigned int) i;
    // const unsigned int j = (unsigned int) i;
}
Run Code Online (Sandbox Code Playgroud)

如我错了请纠正我.考虑类型转换可能是常见问题解答,我不确定这个是否与其他任何内容重复.谢谢!

Kir*_*sky 6

const在转换类型中添加关键字意味着结果将是常量.以下内容不能用C++编译(在C中没有效果):

int* x = (const int*)malloc(10); // cannot convert from 'const int *' to 'int *'
Run Code Online (Sandbox Code Playgroud)

你真的不应该在你的C++代码中使用C类型转换.它不安全,只能用于与传统C代码的兼容性.您应该使用C++强制转换.

func3通常const不使用限定符的情况下.const如果没有指针或不是引用类型,那么将限定符添加到函数参数没有什么大的理由.考虑以下:

void func3(      TYPE i);  // no reason to use `const`
void func3(const TYPE& i); // use `const`, so as not to accidentally change `i`
Run Code Online (Sandbox Code Playgroud)

将左值赋给rvalue时,就像在中一样func4,不需要const在强制转换表达式中显式指定限定符.Lvalue-to-rvalue转换将根据C++标准4.1隐式执行.


Ant*_*ams 5

添加const到强制转换就像添加const到任何其他类型说明符---结果对象是const.这意味着什么取决于上下文.如果您添加const在顶层(如const intconst foo或者int* const,你只是有一个const对象.在大多数情况下,这可以被复制和分配,就像一个非const对象可以(虽然有少数例外,如std::auto_ptr).

如果添加const到指针,则还可以将其添加到指向类型.例如,int * constconst指向普通的指针int,而是const int*或是int const*指向a的普通指针const int.

int i;
int* p = (int* const) &i; // fine; top-level const not a problem
int* p2 = (int const*) &i; // error; pointed-to object is const, so this is preserved
int const* p3= (int const*) &i; // OK
Run Code Online (Sandbox Code Playgroud)

const在参数声明的顶层就像声明任何其他局部变量const---你不能修改函数体内的命名对象.但是,这const不构成函数类型的一部分,因此您可以在没有(至少符合编译器)的情况下正向声明该函数.

void func(int i); // forward-declare func
void func(const int i) // this matches the declaration
{
    // i is const here
}
Run Code Online (Sandbox Code Playgroud)

这可以被认为是好的风格---无论变量是否被视为const函数内部是一个实现细节,所以不应该在原型中.在定义中,const如果您不打算修改它,它将遵循声明某些内容的指导原则.

const在参数声明中的其他地方使用(例如作为指针的一部分)会影响函数类型,就像强制转换一样.