gpt4 book ai didi

c++ - 无法将 std::min 传递给函数,std::min 的拷贝有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:45 31 4
gpt4 key购买 nike

std::min 传递给函数不会编译。我将 std::min 的 libcpp 声明复制到我的源文件中并且它有效。

std 版本有什么问题? clang 和 gcc 也是如此。在 Godbolt 上测试:https://godbolt.org/g/zwRqUA

#include <thread>
#include <algorithm>

namespace mystd {
// declaration copied verbatim from std::min (libcpp 4.0)
template <class _Tp> inline constexpr const _Tp&
mymin(const _Tp& __a, const _Tp& __b)
{
return std::min(__a, __b);
}
}

int main()
{
std::thread thr1(std::min<int>, 2, 3); // compile error
std::thread thr2(mystd::mymin<int>, 2, 3); // works
return 0;
}

clang 和 gcc 的错误:

[x86-64 clang 5.0.0 #1] error: no matching constructor for initialization of 'std::thread'

[x86-64 gcc 7.2 #1] error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, int, int)'
[x86-64 gcc 7.2 #1] note: couldn't deduce template parameter '_Callable'

最佳答案

有两个模板函数 min 为一个模板参数重载。他们是

template<class T> constexpr const T& min(const T& a, const T& b);

template<class T>
constexpr T min(initializer_list<T> t);

所以编译器不知道选择哪一个。

您可以使用函数指针的显式转换来告诉编译器您指的是哪个函数。

或者您可以使用中间指针。例如

const int & ( *operation )( const int &, const int & ) = std::min<int>;

然后使用指针operation代替函数std::min

关于c++ - 无法将 std::min 传递给函数,std::min 的拷贝有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47109317/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com