"警告:并非所有控制路径都返回值"是什么意思?(C++)

1 c++ controls warnings

我得到的确切警告是

warning C4715: 'hand::show' : not all control paths return a value
Run Code Online (Sandbox Code Playgroud)

和手::秀是

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

其中side是类型方向的变量

orientation{
    left = -1,
    right = 1
};
Run Code Online (Sandbox Code Playgroud)

警告意味着什么,以及摆脱它的最佳解决方案是什么?

Adr*_*pez 13

你的编译器不够智能,不能考虑到只有两个选项sideleftright,所以它认为没有一个return语句可以执行.什么时候side都不leftright,你的功能没有说明返回哪个值.


Nat*_*ath 7

错误意味着如果side既不是左边也不是右边,你的函数将不会返回一个值 - 任何一方声明不正确或你的枚举是.枚举应该定义为

enum orientation {left, right};
Run Code Online (Sandbox Code Playgroud)

因此,尝试将您的方向结构更改为.


Mr *_*ooz 6

如果side不是leftright,则返回值未定义.

即使orientation是仅包含两个值的枚举(现在),由于以下任何原因,它仍然可以具有不同的值:

  • 在将来,您可以更改标题以在枚举中包含其他值,因此假设这将发生(并且您的编译器很好并且现在警告您)是防御性编程.
  • side可能是未初始化的,所以它既不是left也不是right
  • side 可能已经通过类型转换分配了另一个值,例如 *((int*)&side) = 2

可能的方案包括:

  • 替换第二ifelse由某事物的建议.
  • 将其更改为:

    if(side == left) {
        return ...;
    } else if(side == right) {
        return ...;
    } else {
        ...handle error...
    }
    
    Run Code Online (Sandbox Code Playgroud)