我知道这是一个非常古老的话题,但我不明白为什么它在这里表现得如此。
该程序:
#include <vector>
#include <algorithm>
#include <cmath>
int main()
{
std::vector<double> a = {1,4,9,16};
std::transform(a.begin(), a.end(), a.begin(), sqrt); // WORKS
std::transform(a.begin(), a.end(), a.begin(), std::sqrt); // compilation error
}
Run Code Online (Sandbox Code Playgroud)
编译错误是
g++ -std=c++17 -O3 main.cpp -Wall -Wextra -pedantic
main.cpp: In function ‘int main()’:
main.cpp:10:57: error: no matching function for call to ‘transform(std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double>::iterator, <unresolved overloaded function type>)’
std::transform(a.begin(), a.end(), a.begin(), std::sqrt); // compilation error
^
........
Run Code Online (Sandbox Code Playgroud)
所以,万一
sqrt 编译器可以推导出参数/返回类型并使用此函数。std::sqrt编译器无法在std::sqrt?.. 的不同重载之间进行选择。为什么会这样?编译时所有类型都是已知的,它到底不能推断出什么?为什么只是简单的sqrt作品(我找不到定义)?
以下可能表明正在发生某些事情:
g++ -std=c++17 …Run Code Online (Sandbox Code Playgroud)