小编Bbl*_*dee的帖子

带有和不带有 std:: 前缀的数学函数之间的另一个冲突

我知道这是一个非常古老的话题,但我不明白为什么它在这里表现得如此。

该程序:

#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)

所以,万一

  1. sqrt 编译器可以推导出参数/返回类型并使用此函数。
  2. std::sqrt编译器无法在std::sqrt?.. 的不同重载之间进行选择。

为什么会这样?编译时所有类型都是已知的,它到底不能推断出什么?为什么只是简单的sqrt作品(我找不到定义)?


以下可能表明正在发生某些事情:

g++ -std=c++17 …
Run Code Online (Sandbox Code Playgroud)

c++ cmath

0
推荐指数
2
解决办法
103
查看次数

标签 统计

c++ ×1

cmath ×1