为何默认参数decltype(i)在MSVC报错但GCC可正常编译?
函数默认参数中使用
decltype(i)的编译器兼容性问题 我知道函数参数可以设置默认值,于是写了下面这段代码,它能在GCC等编译器下编译通过,但在MSVC里会报错。我想知道原因,以及到底哪个编译器的行为符合C++标准。
测试代码
void f(int i, int j = decltype(i){}) { } int main() { f(1); }
MSVC报错信息
example.cpp <source>(1): error C2587: 'i': 非法将局部变量用作默认参数 <source>(1): note: 参见“i”的声明 <source>(4): error C2660: “f”: 函数不接受 1 个参数 <source>(1): note: 参见“f”的声明 <source>(4): note: 尝试匹配参数列表“(int)”时 Compiler returned: 2
结论与分析
MSVC的行为符合C++标准,GCC的实现属于非标准扩展。
根据C++标准规定:函数的默认参数表达式中,不能引用当前函数的参数(哪怕只是用于类型推导)。原因在于默认参数是在函数调用点求值的,此时函数的参数i还未完成初始化,属于未定义的上下文,标准明确禁止这类引用。
GCC允许这种写法是它提供的额外扩展特性,而MSVC严格遵循了标准要求,因此会抛出“非法将局部变量用作默认参数”的错误。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

