【问题标题】:Cast constexpr int[] to void*将 constexpr int[] 强制转换为 void*
【发布时间】:2019-06-18 08:23:41
【问题描述】:

我有一个我不想更改的静态整数数组。我有一个 C 风格的函数,希望将此数组作为 void 指针参数。我正在尝试 const_cast 和 reinterpret_cast 的不同组合,但我不知道自己到底在做什么,而且它一直给我错误。

class Foo
{
    static constexpr int bar[3] = {1,2,3};

    void method()
    {
        cfunction(reinterpret_cast<void*>(const_cast<int*>(&bar)));
    }
};

从类型 'const int ()[3]' 到类型 'int' 的无效 const_cast

我看到它失败了,因为类型不匹配。我也试过const_cast&lt;int[]&gt;(bar),但是const_cast想要一个指针或引用类型。

我在哪里可以阅读有关此主题的信息?我很难理解这里发生了什么。

【问题讨论】:

  • 老实说,不要那样做。如果你的函数试图改变数组怎么办?如果你不能改变函数,不要让数组为 const
  • @MichaelChourdakis 应该是等价的。
  • @Yastanub 不,第一个是指针,第二个是指针的地址
  • cfunction((int*)bar);
  • @MichaelChourdakis 答案部分如下;)

标签: c++


【解决方案1】:
cfunction((void*)bar); 

附:我见过很多程序员在使用所有这些转换时都在苦苦挣扎,而实际上他们只需要简单的 C 转换。如果你坚持 C++ 演员风格,那么

cfunction(reinterpret_cast<void*>(const_cast<int*>(bar)));

(从栏中删除 &)。

【讨论】:

  • 应该是void* 但我觉得没关系
  • 这可行,但有一个警告。我已启用 -Werrors,因此我将在此处收到无法解决的警告。有其他选择吗?
  • 警告是什么?
  • warning: use of old-style cast [-Wold-style-cast]warning: cast from type 'const int*' to type 'void*' casts away qualifiers [-Wcast-qual]
  • 我添加了一个 C++ 风格的。
【解决方案2】:

正如编译器所说,&amp;bar 是一个 const int (*)[3] - 一个指向数组的指针 - 你不能将 const_cast 指向一个 int*

您需要一个指向数组第一个元素的指针,而不是数组。
也就是说,

const_cast<int*>(&bar[0])

或者,等价的,

const_cast<int*>(bar)

当然,这只有在 C 函数从不修改数组时才有效。
如果有任何风险,则不应将其设为 const。

【讨论】:

    【解决方案3】:

    如果 C 函数承诺不修改数据,那么它将采用 const void*。既然没有,它可能会修改它。所以不要让你的数组const

    class Foo
    {
        static int bar[3];
    
        void method()
        {
            cfunction(bar);
        }
    };
    

    并在你的类的.cpp 文件中定义数组:

    int Foo::bar[3] = {1, 2, 3};
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2011-04-03
      相关资源
      最近更新 更多