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的析构函数运行两次?
请注意,这与“Just Y”测试用例不同,因为在该实例中创建了Y临时,然后立即尝试绑定到const X&这是允许的.在三元情况下,运算符本身会引入运算符 *** 作数的公共对象类型的中间切片,在本例中为X.
我相信你可以通过转换为父引用来避免临时切片,但是我没有访问C 11编译器来测试它(除了问题中有些不完整的代码):
const X& var = false ? X{"temporaryX"} : static_cast<const X&>(Y{"temporaryY"});总结
以上是内存溢出为你收集整理的C中的临时,参考和三元运算符全部内容,希望文章能够帮你解决C中的临时,参考和三元运算符所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)