Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用const_cast添加const ness-坏主意?_C++_Pointers_Const Cast - Fatal编程技术网

C++ 使用const_cast添加const ness-坏主意?

C++ 使用const_cast添加const ness-坏主意?,c++,pointers,const-cast,C++,Pointers,Const Cast,众所周知,应该避免使用const_cast删除指针的常量 但反过来又如何呢 对于我的用例,我有一个从非常量源缓冲区复制数据(字节)的函数。 我认为一个好的设计决策应该是根据源缓冲区fully const声明参数 void copyfunction(const char* const data) { ... } 对于下面这样的函数调用,这将导致指针类型错误“const char*const char*” 当然,现在我可以简单地将sourcebuffer声明为const,但在我的例子中,我无法访问

众所周知,应该避免使用const_cast删除指针的常量

但反过来又如何呢

对于我的用例,我有一个从非常量源缓冲区复制数据(字节)的函数。 我认为一个好的设计决策应该是根据源缓冲区fully const声明参数

void copyfunction(const char* const data) { ... }
对于下面这样的函数调用,这将导致指针类型错误“const char*const char*”

当然,现在我可以简单地将
sourcebuffer
声明为const,但在我的例子中,我无法访问该变量,因为它来自不同的代码位置(外部库)

void main(){
char sourcebuffer[]={0x00};
copyfunction(const_cast(sourcebuffer));
}
然而,超越的代码可以工作,但它是好的风格(根据我的用例)

我认为将
copyfunction
的参数声明为const可以确保用户不会修改(只读)指针或源缓冲区本身的位置。 因此,在这种情况下,const_cast只会是启用函数调用的必要工具,而不会故意删除指针的const


问候

您不应使用
const\u cast
添加
const
,因为:

  • 没必要
    T*
    隐式转换为
    const T*
    。您的问题指出
    charsourcebuffer[]={0x00};copyfunction(sourcebuffer)是一个错误,但事实并非如此

  • 这可能(尽管不太可能)有害。它可以从指针类型中删除
    volatile
    ,这不是本文的目的,如果
    sourcebuffer
    被声明为
    volatile sourcebuffer[]
    ,则会导致未定义的行为


  • 您不应该使用
    const\u cast
    添加
    const
    ,因为

  • 在操作安全的情况下,几乎总是不需要
    int*
    隐式转换为
    const int*

  • void assign_ptr( int const*& lhs, int const* rhs ) { lhs = rhs; }
    int const foo = 7;
    int* bar = nullptr;
    assign_ptr( const_cast<int const*&>(bar), &foo );
    *bar = 2; // undefined behavior!
    std::cout << foo << "@" << &foo << "\n"; // will print probably 7@something
    std::cout << *bar << "@" << bar << "\n"; // will print probably 2@same address as above!
    
  • 它可以做一些你不想让它做的事情。它可以剥离
    volatile
    ,或者让您错过
    const
    被添加到变量中其他地方的事实,而您的
    const_cast
    现在会自动剥离它们

  • 在需要添加
    const
    的情况下,以难以解释的方式使用它是危险的

  • 在某些情况下,您需要调用
    const\u cast
    ,以添加不会隐式发生的
    const

    void assign_ptr( int const*& lhs, int const* rhs ) { lhs = rhs; }
    int const foo = 7;
    int* bar = nullptr;
    assign_ptr( const_cast<int const*&>(bar), &foo );
    *bar = 2; // undefined behavior!
    std::cout << foo << "@" << &foo << "\n"; // will print probably 7@something
    std::cout << *bar << "@" << bar << "\n"; // will print probably 2@same address as above!
    
    void assign_ptr(int const*&lhs,int const*rhs){lhs=rhs;}
    int const foo=7;
    int*bar=nullptr;
    分配ptr(常量演员表(bar)和foo);
    *bar=2;//未定义的行为!
    
    std::cout在该用例中编译(一旦您生成
    main
    return
    int
    ),为什么需要显式强制转换它?
    常数将为。而
    main
    的返回类型是
    int
    ,而不是
    void
    ,不需要。非常量变量可以隐式地强制转换为const.Aha!非常有帮助!对不起,我还不确定。。。所以你只能在用来移除常量的地方找到常量施法的代码狙击手是有道理的。谢谢@SteveMurdoc在某些情况下,
    const\u cast
    会增加
    const
    ness,但这样做是危险的:
    int**
    int const**
    。看这里:我已经知道矩形不是正方形了。(好吧,反正不是所有的矩形。)不太明显的是,我认为,正方形不是矩形…@Nemo-Ya,PEBKAC-bug。修正了。@yakboost::optional=get\u child\u optional(路径);在我的代码中,由于同样的原因失败,据我所知。我试图说明我不在代码中修改ptree的意图。正确的方法是什么?因为问题可能出在我身上,我想改变我的想法。另一方面,为什么int*const*==int-const*const*?这不是我以前遇到过的。您好,添加常量来调用常量类函数怎么样?
    void assign_ptr( int const*& lhs, int const* rhs ) { lhs = rhs; }
    int const foo = 7;
    int* bar = nullptr;
    assign_ptr( const_cast<int const*&>(bar), &foo );
    *bar = 2; // undefined behavior!
    std::cout << foo << "@" << &foo << "\n"; // will print probably 7@something
    std::cout << *bar << "@" << bar << "\n"; // will print probably 2@same address as above!