C++ 在C++;,命名参数的范围是否包括其默认值的表达式?

C++ 在C++;,命名参数的范围是否包括其默认值的表达式?,c++,scope,c++14,overloading,default-value,C++,Scope,C++14,Overloading,Default Value,示例:这是合法的C++14吗 #包括 静态int d(){ 返回42; } 静态int e(int d=d()){ 返回d; } int main(){ std::cout这似乎是不合法的:请参见C++14规范() 在您的情况下,d的声明已经完成,因此当您使用d()时,您指的是变量,而不是函数。来自: 名称的声明点在其完成后立即出现 声明符及其初始值设定项(如有)之前,除非如下所述 例如: unsigned char x = 12; { unsigned char x = x; } 这里,第二

示例:这是合法的C++14吗

#包括
静态int d(){
返回42;
}
静态int e(int d=d()){
返回d;
}
int main(){

std::cout这似乎是不合法的:请参见C++14规范()

在您的情况下,
d
的声明已经完成,因此当您使用
d()
时,您指的是变量,而不是函数。

来自:

名称的声明点在其完成后立即出现 声明符及其初始值设定项(如有)之前,除非如下所述

例如:

unsigned char x = 12;
{ unsigned char x = x; }
这里,第二个
x
用它自己的(不确定)值初始化

Clang与本节标准一致。GCC似乎只在
{block}
中应用它

鉴于:

constexpr int d() {return 42;}
以下内容在Clang中失败,但在GCC中有效:

static int e(int d = d()) {return d;}
             // This ^^d should refer to the new name that shadows ::d()
以下内容在Clang和GCC中均失败:

void func(){
    int d = d();
         // ^^d here refers to the new name that shadowed ::d();
 }

同样适用于clang 3.9.1,也许我的常识告诉我clang在这种情况下是正确的,因为
d
参数隐藏了
d
全局函数。不过不要引用我的话。我认为@DeiDei是正确的:
静态int e(int d=::d()){return d;}
编译。我以前觉得这些问题很有趣,但现在我的第一反应是..谁在乎呢?这样的代码无论如何都不会通过审查。为变量和函数选择一个更好的名称。我们确定这适用于默认参数吗?有几种不同于bog标准初始化的方式。基本上:这是r吗真的是一个初始值设定者吗?@LightnessRacesinOrbit,“这真的是一个初始值设定者吗?”-根据,我会说是的,它是。
void func(){
    int d = d();
         // ^^d here refers to the new name that shadowed ::d();
 }