【发布时间】:2016-06-13 23:02:45
【问题描述】:
以下代码可以使用 GCC 干净地编译:
void func(int arg1, decltype(arg1) arg2)
{
(void)arg2;
}
int main(){}
我用这个命令编译:
g++ -std=c++14 test.cpp -o test -pedantic-errors -Wall -Wextra
但是在函数声明中间使用参数似乎很奇怪。它实际上在标准 C++ 中有效,还是 GCC 扩展?
【问题讨论】:
-
我假设
arg1的类型在您的实际代码中要复杂得多?在不查看规范或任何参考资料的情况下,但对解析有所了解,我想这没关系,因为像 C++ 这样的解析语言在很大程度上是从上到下从左到右的事情。当编译器解析arg2的声明时,它肯定已经解析了arg1的声明,所以它肯定知道arg1的类型。如果它真的被“允许”我不知道,它是否会在相反的方向工作(使用decltype(arg2)代表arg1)。 -
@JoachimPileborg 当然,实际代码中
arg1的类型要复杂得多,否则我什至会考虑尝试在其上使用decltype。 -
FWIW、MSVC++2013 及其 Intellisense (EDG) 也都接受它。
-
匹配参数参数的首选方法是通过模板参数(尽管这不是问题所要问的),但我认为您的提议是有效的。
-
@callyalater 但它不是函数模板。 OP 想要
arg1的特定类型,以及arg2的相同类型(只是该类型显然是拼写的 PITA)
标签: c++ function gcc language-lawyer