【问题标题】:What is the named cast of old style cast: pv = (void*)ps;旧式演员表的命名演员表是什么: pv = (void*)ps;
【发布时间】:2012-10-13 06:02:36
【问题描述】:

旧式转换的代码:

const string *ps;  
void *pv;

pv = (void*)ps;

我尝试了三种不同的命名演员表:

pv = static_cast<void*>(ps); //  error: invalid static_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’

pv = const_cast<void*>(ps); // error: invalid const_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’

pv = reinterpret_cast<void*>(ps); // error: reinterpret_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’ casts away qualifiers

如您所见。没有任何效果。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您应该const_cast,但要输入正确的类型。从string*void* 的转换将自动发生。

    pv = const_cast<string*>(ps);
    

    【讨论】:

      【解决方案2】:

      在这种特殊情况下,它只是:

      pv = const_cast<string*>( ps );
      

      string*void* 的转换是隐式的。如果你想 明确地说,您需要第二个单独的演员表:

      pv = static_cast<void*>( const_cast<string*>( ps ) );
      

      pv = const_cast<void*>( static_cast<void const*>( ps ) );
      

      不过,我不认为明确说明是特别必要的;这 事实上你正在使用void* 已经说过会有 转化率。

      【讨论】:

        【解决方案3】:

        您必须先删除 const-ness,然后再删除 static_cast:

        pv = static_cast<void*>(const_cast<string*>(ps));
        

        【讨论】:

          【解决方案4】:

          您只需要一个const_cast,因为到(但不是从)void* 的转换会自动发生(要从 void 转换,请使用 static_cast):

          pv = const_cast<string*>(ps);
          

          【讨论】:

            【解决方案5】:

            我没有尝试 - 我猜你是 2 个演员 - 因为下面发布的链接,所以不应该使用它。

            pv = reinterpret_cast<void*>(const_cast<string*>(ps));
            

            根据 C++03,唯一安全的方法似乎是使用 static_cast 从/转换为 void*

            pv = static_cast<void*>(const_cast<string*>(ps));
            

            我不会使用隐式转换,因为它隐藏了转换。 但是你的演员阵容看起来是个坏主意——这是什么背景?


            我刚刚找到when to use reinterpret_cast,现在我明白为什么 static_cast 更好了。我仍然不喜欢它,因为它在某种程度上隐藏了(在我看来)铸造无效的危险部分。在评论中,只需搜索所有 reinterpret_casts 并查看潜在危险的地方是很容易的。

            【讨论】:

            • 重新解释演员表不是必需的,并且有潜在危险。指针会自动转换为 void 指针,因此只需要 const。
            猜你喜欢
            • 2013-01-30
            • 1970-01-01
            • 2017-12-22
            • 2014-12-02
            • 2012-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多