【发布时间】:2021-07-28 18:19:16
【问题描述】:
struct A
{
auto g1()
{
return true;
}
void f()
{
if (auto b = g1(); b) // ok
{
return;
}
if (auto b = g2(); b) // error: use of 'auto A::g2()' before deduction of 'auto'
{
return;
}
}
auto g2()
{
return true;
}
};
为什么带有初始化程序的 C++17 if 语句不能按预期工作?
【问题讨论】:
-
您可以将您的演示简化为
struct A { void f() { g2(); } auto g2() { } };。 if-initializer 是一个红鲱鱼。 -
我在这里猜测,但这是否与我们可以在类中调用稍后声明的函数的原因相同?在检查类本身之后检查成员函数的主体。正因为如此,
auto推导还没有开始,因为函数体还没有被解析。如果你把g2放在f上面,它就可以正常工作。 -
@OP,我注意到你用标准标签标记了这个。这是否意味着您正在寻找标准中的文本来支持发布的任何答案?
-
@NathanOliver,是的。这正是我的意思。
-
好的。我更新为使用语言律师标签
标签: c++ c++17 language-lawyer auto type-deduction