提问人:myoldgrandpa 提问时间:8/28/2023 最后编辑:myoldgrandpa 更新时间:8/29/2023 访问量:142
is_constructible_v<std::string&&, std::string&&>是什么意思?
What does is_constructible_v<std::string&&, std::string&&> mean by?
问:
我能理解什么是.
但是什么意思?is_constructible_v<std::string, std::string&&>
is_constructible_v<std::string&&, std::string&&>
和 和有什么不一样?is_constructible_v<std::string, std::string&&>
is_constructible_v<std::string&&, std::string&&>
我认为这意味着从右值构造 rvalue。但我不清楚这意味着什么。如果 T 只是可构造的,它的构造函数总是可以用作右值。这就是构造右值的意义吗?is_constructible_v<std::string&&, std::string&&>
constructing rvalue
答:
std::is_constructible_v<std::string&&, std::string&&>
测试是否
std::string&& obj(std::declval<std::string&&>());
格式良好(参见 [meta.unary.prop] p9),确实如此。您可以创建右值引用,如下所示:
std::string&& obj(std::string{}); // string&& from string&&
评论
false
<foo, foo&&>
true
<foo&&, foo&&>
& obj(std::string{})
格式也很好”
- 是的,但反之可能并非如此。但是,如果可以将右值引用绑定到任何值引用,则测试的有用性值得怀疑,因为您始终可以这样做。obj
T
is_constructible_v<T&&, T>
is_constructible_v<T&&, U>
is_constructible
&
/&&
在第一个参数和其余参数中具有不同的含义。is_constructible
在第二个(以及以下任何)参数中,它们指定值类别:for lvalue 和 / for rvalue。&
&&
在第一个参数中,/ 是我们正在构造的变量类型的一部分,而不是值类别。&
&&
因此,我们正在构造一个 from a rvalue type .is_constructible_v<std::string, std::string&&>
std::string
std::string
在 中,我们从 类型的右值构造一个(引用,而不是字符串)。is_constructible_v<std::string&&, std::string&&>
std::string&&
std::string
下面是一个如何发生的例子:
std::string a;
std::string &&b = std::move(a); // `move` here returns an rvalue of type `std::string &&`
令人困惑的是,接近和返回类型也意味着微妙不同的东西。前者是参考。而后者使返回 xvalue,而不是 prvalue(按值返回时)或左值(返回引用时)。严格来说,后者不会产生任何参考。&&
b
&&
move
b
move
&
评论
b
std::string
is_constructible
std::string&&
std::string
评论