【发布时间】:2016-06-11 06:48:16
【问题描述】:
使用g++ (Ubuntu 4.8.5-1ubuntu1) 4.8.5 并使用g++ -std=c++11 -Wall -Wextra -Wconversion 编译
以下内容未按预期编译:
template <typename T>
struct Foo {
Foo(T t) {}
};
struct Bar {
Bar(Foo<float> foo) : foo(foo) {} //Trying to convert Foo<float> to Foo<double>
Foo<double> foo;
};
如预期的那样,下面的编译带有来自-Wconversion 的警告:
void foo(float t){}
int main() {
foo(3.141592653589794626);
return 0;
}
但是,以下编译时没有警告:
#include <functional>
void foo(double t){}
struct Bar {
Bar(std::function<void(float)> foo) : foo(foo) {} //Convert std::function<void(float)> to std::function<void(double)>
std::function<void(double)> foo;
};
int main(){
Bar bar(foo); //Convert std::function<void(double)> to std::function<void(float)>
bar.foo(3.141592653589794626); //Rounded to: 3.141592741012573
foo(3.141592653589794626); //Not rounded: 3.141592653589794
return 0;
}
显然这是float<->double 的一些自动转换,但为什么在第三个示例而不是第一个示例中允许它?为什么-Wconversion 没有捕捉到这个?
(不可见的精度损失是许多领域的问题,例如在处理纬度/经度时)。
【问题讨论】:
标签: c++ templates c++11 type-conversion std