在自己的默认值中使用参数名称 - 是否合法?

vla*_*don 9 c++ parameters language-lawyer default-parameters

enum class E {
    One,
    Two
};

void foo(E value = decltype(value)::One) {
}
Run Code Online (Sandbox Code Playgroud)

它可以用Clang(3.9)编译,但不能用GCC 6.1编译:value was not declared in this scope.

什么编译器是对的?

Col*_*mbo 8

根据[basic.scope.pdecl]/1:

声明的一个名字点立即它完成后 声明符(第8条)和其之前初始化(如果有的话),除了下面提到.

所以参数肯定是在那一点声明的.使用它怎么样decltype?措辞已经过时,无意中不允许这样做.见核心问题2082:

根据8.3.6 [dcl.fct.default]第9段,

每次调用函数时都会计算默认参数,且不带相应参数的参数.函数参数的评估顺序未指定.因此,函数的参数不应在默认参数中使用,即使它们未被评估.这禁止在未评估的操作数中使用参数,例如,

void foo(int a = decltype(a){});
Run Code Online (Sandbox Code Playgroud)

这种措辞早于"未评估的操作数"的概念(短语"未评估"是指对提供实际参数的函数的调用,因此不使用默认参数,而不是未评估的操作数),不应适用于此类情况.

所以引用的段落被修改为阅读

参数不应作为默认参数中可能已评估的表达式出现.

由于操作数decltype未被评估,现在这很好,GCC是错误的.