这是一个有趣的问题,在此之前我都未曾想到隐式转换居然还有“值变换”,如左值隐式转换为右值,那么我们就来稍微介绍一下
假定读者阅读过此文档的值变换的内容: https://zh.cppreference.com/w/cpp/language/implicit_conversion
int x = 0;
int y = x;
赋值运算符左边需要一个lvalue,右边需要一个rvalue,如果给它一个lvalue,该lvalue会被隐式转换成rvalue。这个过程是理所当然的
#include
struct Test {
Test() {
puts("构造函数");
}
~Test() {
puts("析构函数");
}
int v = 0;
};
int main() {
Test();
std::cin.get();
}
prvalue 如果不用来初始化类型相同的对象,就会隐式转换到 xvalue (此时初始化一个临时对象),甚至放着不管也会转换,造成一次构造一次析构
C++继 glvalue 可以隐式转换到 prvalue 之后,现在 prvalue 也可以隐式转换到 xvalue 了
所以它在main函数结束前就打印构造函数与析构函数
另外附上一些详细说明
博客园: https://www.cnblogs.com/jerry-fuyi/p/12927532.html
知乎: https://www.zhihu.com/question/382696217/answer/1106386374
注意,到此我们都默认读者清楚c++的值类别,我们只谈它们间的隐式转换,如果对此也不清楚,请阅读:https://zh.cppreference.com/w/cpp/language/value_category