【发布时间】:2019-10-18 15:10:57
【问题描述】:
我目前正在尝试类模板编程,并且在将命名的 lambda 作为其参数传递时遇到了我无法理解的这种奇怪行为。有人可以解释为什么下面的 (1) 和 (2) 不起作用吗?
template<typename Predicate>
class Test{
public:
Test(Predicate p) : _pred(p) {}
private:
Predicate _pred;
};
int main(){
auto isEven = [](const auto& x){ return x%2 == 0; };
// Working cases
Test([](const auto& x){ return x%2 == 0; });
Test{isEven};
auto testObject = Test(isEven);
// Compilation Error cases
Test(isEven); // (1) Why??? Most vexing parse? not assigned to a variable? I cant understand why this fails to compile.
Test<decltype(isEven)>(isEven); // (2) Basically same as (1) but with a workaround. I'm using c++17 features, so I expect automatic class parameter type deduction via its arguments
return 0;
};
编译器错误消息:(1) 和 (2) 相同
cpp/test_zone/main.cpp: In function ‘int main()’:
cpp/test_zone/main.cpp:672:16: error: class template argument deduction failed:
Test(isEven);
^
cpp/test_zone/main.cpp:672:16: error: no matching function for call to ‘Test()’
cpp/test_zone/main.cpp:623:5: note: candidate: template<class Predicate> Test(Predicate)-> Test<Predicate>
Test(Predicate p): _p(p){
^~~~
cpp/test_zone/main.cpp:623:5: note: template argument deduction/substitution failed:
cpp/test_zone/main.cpp:672:16: note: candidate expects 1 argument, 0 provided
Test(isEven);
^
请原谅我的格式,并编译错误消息 sn-p,因为它与确切的行不匹配。我正在使用 g++ 7.4.0,并使用 c++17 功能进行编译。
【问题讨论】:
-
clang 告诉
cannot use parentheses when declaring variable with deduced class template specialization type关于 (1)。 UPD 像宋元瑶所说的那样添加括号有帮助,lol
标签: c++ templates lambda class-template generic-lambda