【问题标题】:no matching constructor for initialization of 'string' (aka 'basic_string<char>')'string' 的初始化没有匹配的构造函数(又名 'basic_string<char>')
【发布时间】:2015-05-26 14:34:47
【问题描述】:

代码如下:

#include <iostream>
#include <string>

using namespace std; 

class Foo { 
public:
    operator string() const { return n; }
    string n {"foo"};
};

int main (int argc, char** argv) {

    string s {Foo{}};
    cout << s << endl;

    return 0;
}

这段代码使用 gcc 4.8.3 编译,但它没有使用 clang 3.5 编译,有人能告诉我它有什么问题吗?

我收到这样的错误:

main.cpp:45:12: error: no matching constructor for initialization of 'string' (aka 'basic_string<char>')
    string s {Foo{}};
           ^ ~~~~~~~

clang --version:

clang version 3.5.0 (tags/RELEASE_350/final 216961)
Target: x86_64-suse-linux
Thread model: posix

谢谢

【问题讨论】:

  • 一个明显的可能性:你没有包含 &lt;string&gt; (而 gcc 恰好从你包含的其他一些标头中包含 &lt;string&gt;)。
  • 如果我们能获得完整的文件(包括所有文件)以减少在解释数据时出现人为错误的可能性,那就太好了。

标签: c++ string c++11 clang


【解决方案1】:

我相信这是一个 clang 错误。根据[dcl.init.list]中的列表初始化规则:

T 类型的对象或引用的列表初始化定义如下:

  • 如果T 是一个类类型并且初始化列表有一个cv U 类型的元素,其中UT 或派生自T 的类, [...]
  • 否则,如果 T 是字符数组并且 [...]
  • 否则,如果 T 是一个聚合,[...]
  • 否则,如果初始化列表没有元素 [...]
  • 否则,如果 Tstd::initializer_list&lt;E&gt; 的特化,[...]
  • 否则,如果T 是类类型,则考虑构造函数。枚举适用的构造函数 并且通过重载决议(13.3、13.3.1.7)选择最好的一个。如果缩小转换(见 下面) 需要转换任何参数,程序格式错误。
  • [...]

T 是一个类类型,所以我们考虑basic_string constructors。该列表中的#7(复制构造函数)是一个适用的、可行的构造函数,因此应该选择它。此时,这些表达式应该是等价的:

struct Foo {
    operator std::string() const { return "hello"; }
};

std::string s{Foo{}};  // error
std::string s(Foo{});  // OK
std::string s = Foo{}; // OK

但由于某种原因,在列表初始化的情况下,clang 抱怨说:

第一个参数没有从Fooconst std::__cxx11::basic_string&lt;char&gt; &amp; 的已知转换

虽然有,所以我将其归档为LLVM Bug 23658

【讨论】:

  • 我也做了llvm.org/bugs/show_bug.cgi?id=23657我还没有看到你的编辑。
  • 转换运算符的const 限定符不是使其不适用于临时创建的对象吗?
  • @bolov 不。这是 const 限定符,而不是 &amp; 限定符。
  • OP 中的程序使用 clang++3.7 tip-of-trunk 和 libc++ 编译
  • 我注意到使用 ToT 编译成功,并将 #23658 作为 #23657 的副本关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多