函数式 C++11 奇怪的行为
Functional C++11 strange behavior
为什么这行不编译:
function<const int&(const int&, const int&)> min_ptr = min<int>;
但这很好用:
const int &(*min_ptr)(const int&, const int&) = min<int>;
函数 class 似乎是函数指针的灵活且舒适的替代品。但为什么这个案例不起作用?
编辑。我的代码:
#include <functional>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
const int&(*min_ptr)(const int&, const int&) = min<int>; //It is works fine
function<const int&(const int &, const int&)> min_f = min<int>;// Doesn't compile
/*
Error message:
error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type
‘std::function<const int&(const int&, const int&)>’ requested function<const int&(const int &, const int&)> min_f = min<int>;
*/
return 0;
}
gcc 版本 4.8.2,--std=c++11
分配给
const int &(*min_ptr)(const int&, const int&)
还将 min<int>
转换为特定签名。转换为 std::function
不会。
添加
static_cast<const int &(*)(const int&, const int&)>
分配给 std::function
以使其正常工作。
auto* min_ptr = min<int>;
也无法正常工作。
min<int>
的重载不止一种需要考虑。
std::function<const int&(const int &, const int&)> min_ptr =
[](auto&&...args)->decltype(auto){
return min<int>(decltype(args)(args)...);
};
也适用于 C++14。
为什么这行不编译:
function<const int&(const int&, const int&)> min_ptr = min<int>;
但这很好用:
const int &(*min_ptr)(const int&, const int&) = min<int>;
函数 class 似乎是函数指针的灵活且舒适的替代品。但为什么这个案例不起作用?
编辑。我的代码:
#include <functional>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
const int&(*min_ptr)(const int&, const int&) = min<int>; //It is works fine
function<const int&(const int &, const int&)> min_f = min<int>;// Doesn't compile
/*
Error message:
error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type
‘std::function<const int&(const int&, const int&)>’ requested function<const int&(const int &, const int&)> min_f = min<int>;
*/
return 0;
}
gcc 版本 4.8.2,--std=c++11
分配给
const int &(*min_ptr)(const int&, const int&)
还将 min<int>
转换为特定签名。转换为 std::function
不会。
添加
static_cast<const int &(*)(const int&, const int&)>
分配给 std::function
以使其正常工作。
auto* min_ptr = min<int>;
也无法正常工作。
min<int>
的重载不止一种需要考虑。
std::function<const int&(const int &, const int&)> min_ptr =
[](auto&&...args)->decltype(auto){
return min<int>(decltype(args)(args)...);
};
也适用于 C++14。