问题标签 [language-lawyer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 删除 null void* 指针是未定义的行为吗?
我知道delete
空指针是无操作的:
在任一替代方案中,如果 delete 的操作数的值是空指针,则该操作无效。
(C++ 标准5.3.5 [expr.delete] p2
)
而且删除void*
指针是未定义的行为,因为无法调用析构函数,因为没有类型的对象void
:
在第一种
delete object
选择(如果不是,则行为未定义。
(C++ 标准5.3.5 [expr.delete] p2
)
现在,通常我认为首先列出的内容会覆盖稍后列出的内容,但是void*
下面的空指针呢?
c++ - 为什么用'new'分配时不能未实现虚函数?
对于堆栈上的对象,它工作正常。new
但是对于使用(not )在堆上的分配malloc
,它会给出链接器错误:
c++ - 具有静态存储持续时间的对象中的未初始化指针是否已初始化为 NULL 或全零?
出于好奇,因为我现在手头没有标准副本:
给定一个空指针不由全零模式表示的实现,具有静态存储持续时间的对象的未初始化指针成员将被初始化为正确的空指针值还是全零值?
更少的标准,更多的代码:
给定 0x00000001 的 NULL 指针表示,对于main()开头的 fp 的按位表示,我能期待什么?
c++ - 为什么没有返回语句时没有编译器错误?
与 Java 不同,在 C/C++ 中允许以下内容:
这通常会导致崩溃和难以调试的问题。为什么标准不强制对非函数进行最终返回?(编译器会为错误的值void
生成错误)return
gcc/msvc 中是否有任何标志来强制执行此操作?(类似-Wunused-result
)
c++ - 字符串::插入字符串末尾
以下两行在 Visual Studio 2005 中做同样的事情:
和
第一个应该抛出 out_of_range 异常还是这是正确的行为?
c - 对多维数组的一维访问:它是明确定义的行为吗?
我想我们都同意通过以一维方式取消引用指向其第一个元素的(可能是偏移的)指针来访问真正的多维数组被认为是惯用的 C,例如:
但是,我的语言律师需要说服这实际上是定义明确的 C!尤其:
标准是否保证编译器不会在 eg
mtx[0][2]
和之间添加填充mtx[1][0]
?通常,从数组的末尾索引(除了末尾的一个)是未定义的(C99,6.5.6/8)。所以以下显然是未定义的:
因此,按照同样的规则,人们会期望以下内容是未定义的:
那么为什么要定义这个呢?
/li>
那么 C 标准的哪一部分明确允许这样做呢?(为了讨论,我们假设c99 。)
编辑
请注意,我毫不怀疑这在所有编译器中都可以正常工作。我要查询的是标准是否明确允许这样做。
c++ - 为什么没有标头不存在是否可以视为缺陷?
标准库包含一个<iosfwd>
标头,它(前向)声明所有流,包括任何typedef
s 并定义char_traits
模板,包括特化。
遗憾的是,没有这样的头<stlfwd>
文件(转发)声明所有常见的 STL 数据类型和函数 vector
,如map
less
sort
typedef
std
§17.4.3.1 [lib.reserved.names] p1
:
除非另有说明,否则C++ 程序将声明或定义添加到命名空间
std
或命名空间内的命名空间是未定义的。std
程序可以将任何标准库模板的模板特化添加到命名空间std
。
是的,这涵盖了(前向)声明的情况,即使标准库中已经存在这些类型。当然,即使添加了这样的声明,大多数(所有?)编译器都会表现得完全正常,但严格来说,语言律师说,这是未定义的行为。typedef
我发现这对于标准容器特别乏味,例如:
现在,这可以被认为是一个缺陷吗?
我的意思是不存在<stlfwd>
标头(或者更好的是<stdfwd>
,覆盖<iosfwd>
)和禁止标准库中已经存在的声明。
此外,根据这个问题,如果一个(转发)完全按照标准的要求声明标准容器、算法和仿函数/函数,则代码应该是完全有效的(如果不是禁止用户在命名空间) ,std
因为不允许实现添加任何隐藏/默认模板参数。
我问这个是因为我正在考虑最终提交一份关于这个的缺陷报告。
c++ - C++11 引入了标准化的内存模型。这是什么意思?它将如何影响 C++ 编程?
C++11 引入了标准化的内存模型,但这究竟意味着什么?它将如何影响 C++ 编程?
内存模型意味着 C++ 代码现在有一个标准化的库可以调用,而不管编译器是谁制作的,也不管它在什么平台上运行。有一种标准方法可以控制不同线程如何与处理器的内存通信。
“当您谈论在标准中的不同内核之间拆分 [代码] 时,我们正在谈论内存模型。我们将在不破坏人们将在代码中做出的以下假设的情况下对其进行优化,”萨特说。
好吧,我可以记住这个和网上可用的类似段落(因为我从出生就拥有自己的记忆模型:P),甚至可以发布作为其他人提出的问题的答案,但老实说,我不完全理解这个。
C++ 程序员甚至以前也用于开发多线程应用程序,那么它是 POSIX 线程、Windows 线程还是 C++11 线程又有什么关系呢?有什么好处?我想了解底层细节。
我也觉得 C++11 内存模型在某种程度上与 C++11 多线程支持有关,因为我经常看到这两者在一起。如果是,具体是怎样的?为什么它们应该相关?
由于我不知道多线程的内部如何工作,以及内存模型的一般含义,请帮助我理解这些概念。:-)
c++ - 为什么禁止一次打开多个命名空间?
可以这样做using namespace foo::bar;
(即使用内部命名空间而不首先使用外部命名空间),为什么标准禁止执行以下操作?
我不是在寻找解决方法,只是对为什么不允许这样做的可能原因。
c++ - 为什么是“使用命名空间 X;” 不允许在类/结构级别?
我想知道它背后的动机。