if (people[i]->alive() == false)
if (!(*people[i]).alive())
第二行代码是否与第一行完全相同?如果没有,为什么第二个不同?
答案 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就会执行。