- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在这个公认的人为设计的示例中,X
类型的右值在语句末尾按预期被销毁。但是,被销毁的对象仍然可以通过非常量引用“x”访问。这是合法的 C++ 吗?如果是这样,结果是未定义的还是未指定的?编译器不应该在这里发出警告吗?我在 g++ 4.8.1 上对此进行了测试。编译器没有发出错误或警告(标志 -pedantic 和 -Wall)。
#include <iostream>
using namespace std;
struct X
{
int i;
X () { cout << "X ctor this address: " << this << endl; }
~X () { cout << "X dtor this address: " << this << endl; }
X & ref() { cout << "X ref this address: " << this << " i = " << i << endl; return *this; }
int & get () { cout << "X get this address: " << this << " i = " << i << endl; return i; }
void print () { cout << "X print this address: " << this << " i = " << i << endl; }
};
int main()
{
X & x = X().ref();
x.get() = 1234;
x.print();
}
这是输出:
X ctor this address: 0x7fff4f38ace0
X ref this address: 0x7fff4f38ace0 i = 0
X dtor this address: 0x7fff4f38ace0
X get this address: 0x7fff4f38ace0 i = 0
X print this address: 0x7fff4f38ace0 i = 1234
最佳答案
很明显是UB,不需要编译器来诊断。
在这种人为设计的情况下,我认为它可以,但一般情况下不会,因此实现这样的功能没有什么意义。
关于C++ 对临时 : is it legal? 进行非常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23518692/
我经常听到有人这样说 All JavaScript code is legal TypeScript code 或 TypeScript is a superset of JavaScript 但是当
如果为对象预留内存(例如,通过 union )但构造函数尚未被调用,调用对象的非静态方法之一是否合法,假设该方法不依赖于值任何成员变量? 我做了一些研究,发现了一些关于“变体成员”的信息,但找不到与此
更新! 请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了什么,因为对我来说,我在这个问题中描述的行为实际上违反了规范。 更新2! 好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什
我有代码: #include template class> struct Foo { enum { n = 77 }; }; template class C> struct Foo {
int ar[] = { 1, 2, 3, }; 这段代码合法吗? (我的意图是) int ar[] = { 1, 2, 3 }; 最佳答案 是的,C89 和 GNU89 中的初始化列表中都允许使用杂
我有一个 map View 被以下代码剪裁成一个圆圈。 roundMapView.layer.cornerRadius = roundMapView.frame.size.width/2
这个问题已经存在: Why sizeof(x++) does not increment the variable x value [duplicate] 关闭 9 年前。 给定以下代码,它在 C
在深入研究 MFC 时,我发现了这段代码: _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL
我正在使用 MKMapSnapshotter 创建一个小型 MKMapView 的 UIImage 屏幕截图(并存储以备后用)。但我注意到的一件事是它从快照中删除了“合法”标签。 Here答案是删除“
在这个公认的人为设计的示例中,X 类型的右值在语句末尾按预期被销毁。但是,被销毁的对象仍然可以通过非常量引用“x”访问。这是合法的 C++ 吗?如果是这样,结果是未定义的还是未指定的?编译器不应该在这
这是一段显然不起作用的代码,因为在构造函数中向下转换“this”是非法的: #include class A { protected: virtual ~A() {} public:
考虑以下语句: int *pFarr, *pVarr; int farr[3] = {11,22,33}; int varr[3] = {7,8,9}; pFarr = &(farr
似乎只有向上滑动才能移除带动画的导航栏。我想让它褪色,就像在 Photos.app 中一样。 更改 alpha 最简单,但是 Apple's guidelines state : Prior to i
考虑一下这个相当无用的程序: #include int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self)
我添加了一个 MKMapView作为 XIB 中我的一个 ViewController 的 subview 。该 map 在显示方向方面工作正常。但是 Legal map 上的文字(左下)显示为 而不
这个问题在这里已经有了答案: JavaScript ternary operator example with functions (6 个答案) Ternary operators in Java
我有两个类如下。 class NeuroShield { public: NeuroShield(); uint16_t begin(); void setNcr(uint16
能够将传递给文字运算符的字符串转换为 MPL 序列会很有用,因为这样我们就可以根据字符串的内容控制代码生成。以前,我认为这是不可能的,因为 constexpr 函数的参数在函数体内不被视为常量表达式。
这是一个有点深奥的问题,但我很好奇以下类扩展模式在现代 C++ 中是否合法(例如,不构成 UB)(出于所有意图和目的,我可以将讨论限制在 C+ +17 及更高版本)。 template struct
我正在使用 MagicalRecord, 这就是我设置 coreData 堆栈的方式 - (BOOL)application:(UIApplication *)application didFinis
我是一名优秀的程序员,十分优秀!