在模板化构造函数中调用构造函数时的有趣行为
Interesting behaviour when calling constructor in templated constructor
我刚刚创建了一个我认为我可以立即完成的非常小的项目(它是关于基本委托的),当我遇到一个我无法追踪的有趣的编译器错误时。这是代码的简化版本:
class NoComp {
};
class Comp {
bool operator==(const Comp& other)
{ std::cout << "Working!" << std::endl; return true;}
};
struct Test {
template<typename T>
Test(T&& obj) {}
bool operator==(const Test& other);
};
int main()
{
Test a(Comp());
Test b(NoComp());
a.operator ==(b);
}
使用 g++ version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)
found here 编译时会产生以下编译器错误:
main.cpp: In function 'int main()':
main.cpp:22:13: error: request for member 'operator==' in 'a', which is
of non-class type 'Test(Comp (*)())'
a.operator ==(b);
我无法弄清楚该错误的含义以及它存在的原因。那里发生了什么,是错误还是标准涵盖?如果可以,我该如何躲避?
你有什么叫most vexing parse。
线条
Test a(Comp());
Test b(NoComp());
不声明变量,而是两个函数a
和b
,采用返回Comp
(NoComp
)且不带参数的指向函数的指针.
如果您可以访问 C++11,请使用列表初始化,即
Test a{Comp()};
Test b{NoComp()};
如果不这样做,请使用双括号
Test a((Comp()));
Test b((NoComp()));
Test a(Comp());
Test b(NoComp());
这声明了两个函数 a
和 b
。第一个有一个 Comp(*)()
类型的参数和一个 Test
类型的 return,第二个有一个 NoComp(*)()
和 return 一个 [=15] =]. Comp()
是一个函数类型,作为函数类型的所有参数,调整为指向函数的指针类型。 NoComp()
.
也是如此
使用双括号:
Test a((Comp()));
Test b((NoComp()));
或从 C++11 开始的列表初始化。
我刚刚创建了一个我认为我可以立即完成的非常小的项目(它是关于基本委托的),当我遇到一个我无法追踪的有趣的编译器错误时。这是代码的简化版本:
class NoComp {
};
class Comp {
bool operator==(const Comp& other)
{ std::cout << "Working!" << std::endl; return true;}
};
struct Test {
template<typename T>
Test(T&& obj) {}
bool operator==(const Test& other);
};
int main()
{
Test a(Comp());
Test b(NoComp());
a.operator ==(b);
}
使用 g++ version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)
found here 编译时会产生以下编译器错误:
main.cpp: In function 'int main()':
main.cpp:22:13: error: request for member 'operator==' in 'a', which is
of non-class type 'Test(Comp (*)())'
a.operator ==(b);
我无法弄清楚该错误的含义以及它存在的原因。那里发生了什么,是错误还是标准涵盖?如果可以,我该如何躲避?
你有什么叫most vexing parse。
线条
Test a(Comp());
Test b(NoComp());
不声明变量,而是两个函数a
和b
,采用返回Comp
(NoComp
)且不带参数的指向函数的指针.
如果您可以访问 C++11,请使用列表初始化,即
Test a{Comp()};
Test b{NoComp()};
如果不这样做,请使用双括号
Test a((Comp()));
Test b((NoComp()));
Test a(Comp());
Test b(NoComp());
这声明了两个函数 a
和 b
。第一个有一个 Comp(*)()
类型的参数和一个 Test
类型的 return,第二个有一个 NoComp(*)()
和 return 一个 [=15] =]. Comp()
是一个函数类型,作为函数类型的所有参数,调整为指向函数的指针类型。 NoComp()
.
使用双括号:
Test a((Comp()));
Test b((NoComp()));
或从 C++11 开始的列表初始化。