C中的临时,参考和三元运算符

C中的临时,参考和三元运算符,第1张

概述我有以下基本代码: struct X { X(const char* descr) {...} ~X() {...} // Not virtual virtual void foo() const {...}};struct Y : public X { Y(const char* descr) {...} ~Y() {...} // Not virtual virt 我有以下基本代码:
struct X {  X(const char* descr) {...}  ~X() {...} // Not virtual  virtual voID foo() const {...}};struct Y : public X {  Y(const char* descr) {...}  ~Y() {...} // Not virtual  virtual voID foo() const {...}};const X& factory() {    static X sampleX{"staticX"};    static Y sampleY{"staticY"};    return X or Y depending of the test case;};

4个测试用例:

只是Y =好的

const X& var = Y{"temporaryY"};var.foo();

结果:

X::X() // base temporaryYY::Y() // temporaryYY::foo()Y::~Y() // temporaryYX::~X() // base temporaryY

只是X =好的

const X& var = X{"temporaryX"};var.foo();

结果:

X::X() // temporaryXX::foo()X::~X() // temporaryX

Y或X via function = OK

const X& var = factory();var.foo();

结果:

X::X() // staticXX::X() // base staticYY::Y() // staticYX::foo() or Y::foo()Y::~Y() // staticYX::~X() // base staticYX::~X() // staticX

Y或X通过三元运算符= WTF ?!

const X& var = false ? X{"temporaryX"} : Y{"temporaryY"};var.foo();

结果:

X::X() // base temporaryYY::Y() // temporaryYY::~Y() // temporaryYX::~X() // base temporaryYX::foo()X::~X() // base temporaryY

有人可以解释为什么七个地狱:

>在范围结束之前调用Y的析构函数?
> X :: foo()被调用而不是Y :: foo()?
> X的析构函数运行两次?

解决方法 你缺少的是你的临时Y正在通过切片复制构造成一个隐藏的临时X,它绑定到你的const引用.那就是你看到的最终析构函数,也解释了为什么Y比预期更早被破坏.这个副本的原因是三元运算符的“返回”只是一种类型. X不可能被视为Y,因此X是要使用的常见类型,从而引起额外的临时X对象.

请注意,这与“Just Y”测试用例不同,因为在该实例中创建了Y临时,然后立即尝试绑定到const X&这是允许的.在三元情况下,运算符本身会引入运算符 *** 作数的公共对象类型的中间切片,在本例中为X.

我相信你可以通过转换为父引用来避免临时切片,但是我没有访问C 11编译器来测试它(除了问题中有些不完整的代码):

const X& var = false ? X{"temporaryX"} : static_cast<const X&>(Y{"temporaryY"});
总结

以上是内存溢出为你收集整理的C中的临时,参考和三元运算符全部内容,希望文章能够帮你解决C中的临时,参考和三元运算符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1242995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存