说我有以下功能:
int foo()
{
return 1234;
}
在不将其返回值分配给任何变量的情况下调用此函数有什么作用:
foo();
另外,使用运算符而不将其返回值分配给任何变量的作用是什么:
1 + 2 + 3;
在C ++中,表达式是有效的语句;计算值将被简单丢弃。
有些编译器很聪明,可以在代码看起来很奇怪的情况下向您发出警告。例如具有:
foo(1,2,3);
可以理解(调用可能具有副作用的函数),但是代码像
x < 3;
之所以没有用,是因为它没有定义的副作用,并且该值被丢弃。
在g ++中,还有一些库函数,尽管这些函数有副作用,但这些函数会被特别标记,因此忽略返回值会发出警告(如fread
),因为这是等待叮咬的错误的标志。
在非常常见的情况下,经常会忽略函数的结果(例如printf
),并且返回值的表达式仅用于副作用(例如std::cout << "Hello";
)。
如果要在运行时强制执行功能的结果未被默默忽略,则有一个有时可以使用的技巧:
template<typename T>
struct must_check {
T x;
bool checked;
must_chec(const T& x) : x(x), checked(false) {}
operator T () { checked = true; return x; }
~must_check() {
if (!checked)
throw std::runtime_error("Result value has not been checked");
}
};
现在不用写
int square(int x) {
return x * x;
}
写吧
must_check<int> square(int x) {
return x * x;
}
然后像
square(12);
将在运行时引发异常,而
int result = square(12);
会很好的工作。
这是可行的,但不是一个好主意,因为在析构函数中引发异常是一种非常糟糕的行为,通常会导致异常终止程序(原因是有时由于异常而自动调用析构函数,而引发另一个异常该阶段的例外是致命的举动)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句