如果引用类型不匹配,为什么 std::is_constructible 会返回 false?

why std::is_constructible will return false if reference type is not match?

提问人:Kevin eyeson 提问时间:1/6/2023 更新时间:1/6/2023 访问量:93

问:

我目前正在研究一些模板的东西。但是我有一个问题。 我有这样的班级

class myobj{
    public:
    int val;
    char single;
    string name;
    myobj(){}
    myobj(int a):val(a){};
    myobj(int a, char b, string& c): val(a), single(b), name(move(c)){};

};

这是函数main

int main(){
    cout << is_constructible<myobj, int>::value << endl; //true
    cout << is_constructible<myobj, int, char, string>::value << endl; //false
    cout << is_constructible<myobj, int, char, string&>::value << endl; //true
    return 0;
}

我不明白为什么第二个会是假的。这是否意味着我不能使用 a 来构造对象? 当函数签名显示参数是按引用传递的时,我认为可以向它传递一个值。对引用有什么误解吗?string

C++ 模板 逐个引用

评论

1赞 Karl Knechtel 1/6/2023
您是否尝试过使用引用?const
0赞 Fantastic Mr Fox 1/6/2023
@KarlKnechtel在这些情况下,我通常会按值执行,然后界面的用户可以选择它适用于右值和左值类型。

答:

5赞 Fantastic Mr Fox 1/6/2023 #1

您可以尝试一下:

myobj(1, 'c', std::string{"lalala"});

这是一个字符串,是的,所以它应该编译吗?不:

error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::string' {aka 'std::__cxx11::basic_string<char>'}
   20 |     myobj(1, 'c', std::string{"lalala"});

现场示例

string在此上下文中,可以引用右值,但右值不能由普通左值引用引用。A 必须是可变的,因此 和 之间存在差异(非常大的差异)。string&stringstring&