【问题标题】:bool pointer member behaviour different on assigning true vs falsebool 指针成员行为在分配 true 和 false 时不同
【发布时间】:2011-02-16 11:41:59
【问题描述】:

我使用简单的布尔指针类成员。分配错误的resp。 true 表现不同 - 请参阅代码中的 cmets。 我在下面评论一个来测试另一个。

我使用编译器调用g++ -o basic basic.cpp

class Test
{
public:
    int a;
    bool* abool;
};


int main() {
    Test t;

    //t.abool = false;              // WORKS
    //t.abool = true;               // ERROR: cannot convert 'bool' to 'bool*' in assignment - expected IMO; 

    // this should work for both values IMO
    //*(t.abool) = true;            // Segmentation fault
    //*(t.abool) = false;           // Segmentation fault



    cout << t.abool << endl;

    return 0;
}

【问题讨论】:

    标签: c++ boolean member


    【解决方案1】:

    这是因为存在从false0 的转换。所以它变成了t.abool = 0;,它用NULL初始化abool。但是,true 转换为 1,并且由于无法使用绝对整数初始化指针,因此会出现编译器错误。在第二种情况下(带有注释,这应该可以在 IMO 中使用),当您尝试取消引用调用未定义行为的未初始化指针时,您将遇到 seg 错误。

    【讨论】:

      【解决方案2】:

      您的 bool* 尚未初始化为指向任何内容。

      您可以为它分配一个空指针值(false 将转换为),或一个指向 bool 对象的有效指针:

      bool test;
      
      t.abool = 0; // or NULL
      t.abool = &test;
      

      一旦它指向一个实际的bool 对象,您就可以通过指针为该对象分配bool 值:

      *t.abool = true;
      *t.abool = false;
      

      【讨论】:

        【解决方案3】:

        false 有效,因为 false 可能被 g++ 视为 0

        【讨论】:

        • 这里没有概率,是的。
        【解决方案4】:

        任何数字类型和零值的文字都可以隐式转换为空指针。 bool 是数字类型,false 的值为零。非零值(如true)不能隐式转换为指针。

        【讨论】:

          猜你喜欢
          • 2021-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多