c++ 为什么引用类型不匹配时std::is_constructible会返回false?

1l5u6lss  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(111)

我现在在学一些模板的东西。但是我有一个问题。我有一个这样的课

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;
}

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

yiytaume

yiytaume1#

你可以试试看:

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"});

Live example
string在这个上下文中可以引用右值,但是右值不能被正常的左值引用引用引用。string&必须是可变的,因此stringstring&之间存在差异(非常大的差异)。

相关问题