超载分辨率低于失败clang35 -std=c++11
编译:列表初始化和失败的initializer_list构造
#include <iostream>
#include <string>
#include <initializer_list>
class A
{
public:
A(int, bool) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(int, double) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(std::initializer_list<int>) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
int main()
{
A a1 = {1, 1.0};
return 0;
}
错误
init.cpp:15:14: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
A a1 = {1, 1.0};
^~~
init.cpp:15:14: note: insert an explicit cast to silence this issue
A a1 = {1, 1.0};
^~~
static_cast<int>()
OTOH,它告诫,缩小并编译g++48 -std=c++11
init.cpp: In function ‘int main()’:
init.cpp:15:17: warning: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
A a1 = {1, 1.0};
^
init.cpp:15:17: warning: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
和产生的结果
A::A(std::initializer_list<int>)
这两种行为都有意义吗?从cppreference
All constructors that take std::initializer_list as the only argument, or as the first argument if the remaining arguments have default values, are examined, and matched by overload resolution against a single argument of type std::initializer_list
If the previous stage does not produce a match, all constructors of T participate in overload resolution against the set of arguments that consists of the elements of the braced-init-list, with the restriction that only non-narrowing conversions are allowed. If this stage produces an explicit constructor as the best match for a copy-list-initialization, compilation fails (note, in simple copy-initialization, explicit constructors are not considered at all)
引述由于收缩转换是不允许的,我希望重载解析步骤不匹配A(std::initializer_list<int>)
构造,而是匹配A(int, double)
之一。例如,改变A(std::initializer_list<int>)
到A(std::initializer_list<std::string>)
既clang35
和g++48
并打印
A::A(int, double)
如预期编译。
大概你的意思是铿锵3.5。你命名这个二进制文件并不是真正有用的:)'mv clang25 clang35'“oops” – 2015-02-07 04:39:39
你是对的:)这是团队在工作中维护构建系统时使用的版本控制惯例,我从来没有给过它一个想法。 – Pradhan 2015-02-07 07:00:43