【问题标题】:Are variadic arguments after a defaulted parameter well-formed?默认参数后的可变参数是否格式正确?
【发布时间】:2016-02-25 22:55:05
【问题描述】:
template <typename... Args>
void bark( int = 0, Args&&... args ) {}

int main() {
     bark();
     bark(1);
     bark(1, 2);
}

这段代码的格式是否符合 C++ 标准?

建议的副本不包含相同的函数调用。

【问题讨论】:

  • 不是重复的:stackoverflow.com/questions/29098835/…,不包含相同形式的调用。
  • 对我来说好像是重复的。即使调用不相同,该问题中的答案也会显示标准的两个部分,即即使在这种情况下它也无效。
  • 该问题中提出的问题已在 Clang 中修复,但 Clang 仍然拒绝此代码。
  • 嗯,我误读了那里答案中的标准 sn-p。根据标准,它实际上 is 应该是有效代码。虽然它仍然是重复的。您的表格与该问题的第一部分相同。
  • 我仍然对为什么这不是骗局感到困惑。另一个问题回答了这个问题。

标签: c++ language-lawyer c++14 variadic-templates


【解决方案1】:

由于CWG 777,声明有效:

在给定的函数声明中,a 后面的所有每个参数 带有默认参数的参数 应该有一个默认参数 在此或以前的声明中提供 或应为函数 参数包.

推导在所有三种情况下都应该成功,因为默认参数对推导的性质没有影响:如果没有提供包参数args的参数,则通过[temp.arg.explicit]/3推导为空包,否则[temp.deduct.call]/1 中的常规规则适用(因为该包显然不在非推断上下文中)。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2011-05-07
    • 2017-11-30
    • 2011-08-16
    • 2011-01-20
    • 2016-03-12
    • 2021-10-11
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多