【发布时间】:2016-07-08 15:28:21
【问题描述】:
我想用 map 中的值初始化 const 变量,并且想断言 map 是否不包含这样的值。
有什么优雅的方法可以实现这一点吗?
我希望 c++ ternary operator ?: 能帮助我解决这个问题,但是这段代码不起作用,因为 ternary operator 想要在两边都有相同的类型。
const auto it = modeMap.find(key);
const Mode myMode = (it != modeMap.end()) ? myMode = it->second : assert(false && "Mode doesn't exist");
错误 C2440:“正在初始化”:无法从“void”转换为“const” 模式'
【问题讨论】:
-
您不能使用三元运算符执行此操作,因为三元运算符要求两个分支返回相同的类型。
-
使用
assert不适合运行时检查。首先,它会中止程序,看起来就像一个崩溃,这对其他人使用的任何类型的程序都没有好处。其次,它是一个仅用于调试的宏,如果您创建一个发布版本,断言宏将被空白空间替换。 -
只要您记得它确实是一个宏,并且在发布版本中它会被替换为空格(这可能会导致语法错误,具体取决于您使用它的位置)。
-
如果值不在地图中,在禁用断言的生产情况下会发生什么?我认为你应该要么抛出异常,要么终止你的程序。
-
是的,如果在生产环境中触发,您的程序应该怎么做?现在,它可以做任何事情,可能会产生随机结果。在最好的情况下,它会崩溃。为什么不终止程序并显示错误消息?那将是防御性编程。