之间有什么区别size_t
和std::size_t
,当他们要使用,任何其他差异化功能在他们的声明,其中条款?
"参数"和"参数"之间是否有区别,或者它们只是同义词?
在c++03
它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2
:
在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.
然而,在目前的草案对于c++0x
这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x
,如果是,在哪里?
笔记:
有大量的间接证据表明它仍然有明确的定义.
首先,有两句话§5.3.5/2
说明
在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,...
和
在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或...
这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.
其次,改变意义delete 0
是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变.此外,没有提到这是c++0x
草案兼容性附件(附件C)的重大变化.但是,附件C是一个信息性部分,因此对标准没有任何解释.
另一方面,删除空指针要求无效的事实意味着额外的运行时检查.在很多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突.也许委员会刚刚决定改变行为,使标准c ++更符合语言的既定设计目标.
在C++中,11 basic_string::c_str
被定义为完全相同basic_string::data
,而后者又定义为*(begin() + n)
和*(&*begin() + n)
(when 0 <= n < size()
)完全相同.
我找不到任何要求字符串在其末尾始终具有空字符的内容.
这是否意味着c_str()
不再保证生成以null结尾的字符串?
使用std::rel_ops
将完整的关系运算符集添加到类的首选方法是什么?
该文档建议一个using namespace std::rel_ops
,但是这似乎是有严重缺陷的,因为这将意味着包括以这种方式实现的类的头也将增加全关系运算符所有其他类与定义operator<
和operator==
,即使是不希望的.这有可能以令人惊讶的方式改变代码的含义.
作为旁注 - 我一直在使用Boost.Operators来做这件事,但我仍然对标准库感到好奇.
我正在研究C++ 11中新的,轻松的POD定义(第9.7节)
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
我突出了让我感到惊讶的一些事情.
如果我们容忍具有不同访问控制的数据成员会出什么问题?
如果第一个数据成员也是基类会出什么问题?即
struct Foo {};
struct Good : Foo {int x; Foo y;};
struct Bad : Foo {Foo y; int x;};
Run Code Online (Sandbox Code Playgroud)
我承认这是一个奇怪的结构,但为什么要Bad
被禁止但不是Good
?
最后,如果不止一个组成类有数据成员,会出现什么问题?
我有一个关于std :: set的线程安全性的问题.
据我所知,我可以遍历一个集合并添加/擦除成员,这不会使迭代器无效.
但请考虑以下情况:
程序运行时我经历过段错误,我不确定为什么会这样.缺乏线程安全的原因是什么?
我相信如果你使用C,我理解在内存中如何表示正常的变量和指针.
例如,很容易理解指针Ptr将具有一个地址,并且它的值将是一个不同的地址,这是它指向的内存空间.以下代码:
int main(){
int x = 10;
int *Ptr;
Ptr = &x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将在内存中具有以下表示:
+---------------------+-------------+---------+
| Variable Name | Address | Value |
+---------------------+-------------+---------+
| x | 3342 | 10 |
+---------------------+-------------+---------+
| Ptr | 5466 | 3342 |
+---------------------+-------------+---------+
Run Code Online (Sandbox Code Playgroud)
但是我发现很难理解数组如何在内存中表示.例如代码:
int main(){
int x[5];
x[0]=12;
x[1]=13;
x[2]=14;
printf("%p\n",(void*)x);
printf("%p\n",(void*)&x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出相同的地址两次(为简单起见10568).意思是x ==&x.然而,*x(或数组符号中的x [0])等于12,*(x + 1)(或数组符号中的x [1])等于13,依此类推.怎么能代表这个?一种方法可能是这样的:
+---------------------+-------------+----------+----------------------+
| Variable Name | Address | Value | Value IF array |
+---------------------+-------------+----------+----------------------+
| x | 10568 …
Run Code Online (Sandbox Code Playgroud) 为什么C++采用免费函数:
std::make_unique(...);
std::make_shared(...);
Run Code Online (Sandbox Code Playgroud)
而不是使用静态成员函数:
std::unique_ptr::make(...); // static
std::shared_ptr::make(...); // static
Run Code Online (Sandbox Code Playgroud)
?
一般情况下initialize
,object
当我list
用这种方式将它添加到一个时候即刻- >
list.add(
new foo() { // <--- foo()
field1 = value1,
field2 = value2
}
);
Run Code Online (Sandbox Code Playgroud)
但是一旦我尝试了--->
list.add(
new foo { // <--- foo
field1 = value1,
field2 = value2
}
);
Run Code Online (Sandbox Code Playgroud)
& 有效 !!!
在第二种方式,我只是creating
一个object
没有使用()
它的尾巴.那么有没有人知道这些初始化对象的各种方法之间的区别?