Tav*_*nes 14 c++ gcc clang compiler-bug c++11
以下代码使用GCC 4.9.2编译,但不与Clang 3.5.0编译:
#include <string>
class Foo
{
public:
explicit operator std::string() const;
};
std::string bar{Foo{}}; // Works in g++, fails in clang++
std::string baz(Foo{}); // Works in both
Run Code Online (Sandbox Code Playgroud)
clang ++说:
foo.cpp:9:13: error: no matching constructor for initialization of 'std::string'
(aka 'basic_string<char>')
std::string bar{Foo{}};
^ ~~~~~~~
...: note: candidate constructor not viable: no known conversion from 'Foo' to
'const std::basic_string<char> &' for 1st argument
basic_string(const basic_string& __str);
^
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果std::string被替换为原始类型,它就可以工作int.
这似乎是一个 Clang 错误。[over.match.list]/1:
当非聚合类类型的对象
T被列表初始化时(8.5.4),重载决策分两个阶段选择构造函数:
- [..]
- 如果没有找到可行的初始化列表构造函数,则再次执行重载决策,其中候选函数是类的所有构造函数
T,参数列表由初始化列表的元素组成。
由于第二行编译良好,因此存在不一致:在重载解析方面它们应该是等效的。
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |