#include <iostream>
#include <string>
using namespace std;
struct Print {
template<typename T>
Print(T t){
cout<<(t+=10);
}
};
int main()
{
// 这句为什么是一句函数声明而不是变量创建?
Print p(string());
return 0;
}
clang++ 10.0.0提示:
`warning: parentheses were disambiguated as a function declaration`
为什么会这样,我觉得string()
是创建了一个临时量,这应该是个变量创建才对,为什么编译器会认为是个函数声明呢?
PS.不要吐槽代码,这是一道题 :>
dcl.ambig.res
string()
,string("str")
,string(a)
,在 C++ 语法结构里,都属于 function style cast 。当 function style cast 与 declaration(声明) 出现出现歧义的时候,认为是 declaration。
当 function style cast 与 type id 出现歧义的时候,认为是 type id
string()
可以被认成一个函数类型(type id),返回值是string
,没有参数,然后由于位于函数参数位置,被当作函数指针使用string()
认为是 function style cast,那么Print p(string())
是变量声明。string()
认为是 type id ,那么Print p(string())
是一个函数。(想想Print p(int)
。int
也是一个 type id)两者均合法,有歧义,认为
string()
是 type id ,p
是一个函数。