初始化C数组的参考成员不要在Visual Studio 2015上编译

时间:2018-11-23 10:33:43

标签: c++ visual-studio-2015

当我尝试在g ++上编译下面的代码时,它可以工作,但是在vs2015上,失败并显示以下消息: 错误C2440:“正在初始化”:无法从“ const bool *”转换为“ const bool(&)[3]”

#include <iostream>

enum class Direction
{
       RIGTH,
       LEFT
};

struct Buffer
{
       int catRigth = 4;
       int catLeft = 8;
       bool dogRigth[3] = {true, false, true};
       bool dogLeft[3] = {false, true, false};
};

struct Bind
{
       const int &cat;
       const bool (&dog)[3];
       Bind(const Buffer &buf, Direction direction) :
              cat(direction == Direction::RIGTH ? buf.catRigth : buf.catLeft),
              dog(direction == Direction::RIGTH ? buf.dogRigth : buf.dogLeft)
       {
       }
};

int main(int argc, char* argv[])
{

       const Buffer buff;

       Bind bindRigth(buff, Direction::RIGTH);
       Bind bindLeft(buff, Direction::LEFT);

       int catRigth = bindRigth.cat;
       int catLeft = bindLeft.cat;

       std::cout << catRigth << " " << catLeft;
}

是标准的C ++代码还是gcc特定的功能?

1 个答案:

答案 0 :(得分:1)

MSVC不应将其类型衰减为const bool *

  

5.16.4如果第二和第三操作数是具有相同值类别且具有相同类型的glvalue,则结果是该类型和值类别,并且如果第二或第三操作数是a,则它是位字段。位字段,或者如果两者都是位字段。

MSVC的解决方法可能是:

#include <utility>

const struct A {
    bool a[3] = {false};
} obj;

template <class Lhs, class Rhs>
auto &&Conditional(const bool x, Lhs &&lhs, Rhs &&rhs) {
    if (x)
        return std::forward<Lhs>(lhs);
    return std::forward<Rhs>(rhs);
}

int main(int argc, char* argv[]) {
    const bool (&t)[3] = Conditional(true, obj.a, obj.a);
    return 0;
}

PS:条件不是constexpr函数。

或者:const bool (&t)[3] = *(true ? &obj.a : &obj.a);