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.
什么编译器是对的?
声明的一个名字点立即它完成后 声明符(第8条)和其之前初始化(如果有的话),除了下面提到.
所以参数肯定是在那一点声明的.使用它怎么样decltype?措辞已经过时,无意中不允许这样做.见核心问题2082:
根据8.3.6 [dcl.fct.default]第9段,
每次调用函数时都会计算默认参数,且不带相应参数的参数.函数参数的评估顺序未指定.因此,函数的参数不应在默认参数中使用,即使它们未被评估.这禁止在未评估的操作数中使用参数,例如,
Run Code Online (Sandbox Code Playgroud)void foo(int a = decltype(a){});这种措辞早于"未评估的操作数"的概念(短语"未评估"是指对提供实际参数的函数的调用,因此不使用默认参数,而不是未评估的操作数),不应适用于此类情况.
所以引用的段落被修改为阅读
参数不应作为默认参数中可能已评估的表达式出现.
由于操作数decltype未被评估,现在这很好,GCC是错误的.