这两个if语句是否意味着同样的事情?

时间:2016-02-24 05:54:25

标签: c++ if-statement

if (people[i]->alive() == false)

if (!(*people[i]).alive())

第二行代码是否与第一行完全相同?如果没有,为什么第二个不同?

3 个答案:

答案 0 :(得分:6)

它们是相同的,假设没有异常的运算符重载有效。我建议:

if (!people[i]->alive())

答案 1 :(得分:1)

假设

using people_type = std::decay_t<decltype(people[i])>;

并且

没有重载
  • people_type::operator->() /* cv/ref qualifier*/
  • people_type::operator*() /* cv/ref qualifier*/

然后people[i]->alive()(*people[i]).alive()是等效的。

现在,假设

using alive_type = std::decay_t<decltype(people[i]->alive())>;

并且

没有重载
  • alive_type::operator!() /* cv/ref qualifier*/
  • alive_type::operator==(bool /*or compatible*/ ) /* cv/ref qualifier*/
  • operator==(/* cv/ref qualifier*/ alive_type, bool /*or compatible*/)

然后people[i]->alive() == false!(*people[i]).alive()兼容。

如果存在其中一个重载,则等效性取决于实现,但是如果用户期望在没有过载时存在兼容性,则使这两个代码不同将是不好的方式。

答案 2 :(得分:-1)

if (!people[i]->alive())

这将起作用,因为alive()函数返回boolean值,并且只要返回false,if就会执行。