为什么可以将NULLPTR分配给STD :: String
Why can you assign nullptr to std::string?
所以今天我写了一个很难找到错误的错误,其中我将std ::字符串初始化为nullptr(不是std :: string的指针,而是值本身)。我发现显然只能在C 11或更高版本中使用Clang进行。
#include <string>
#include <iostream>
using namespace std;
class Meh{
int x;
};
class Foo
{
private:
std::string x=nullptr;
Meh y=nullptr; //remove this line and it compiles
public:
std::string z=nullptr;
};
int main(void)
{
Foo f;
cout << f.z;
return 0;
}
如您所见,我尝试将NULLPTR分配给类的随机实例,但它不起作用。字符串中有什么魔术可以使它起作用,这种有效的语法是什么?在这种情况下,我以为我会遇到类型的铸造错误。
用于参考我对此进行了编译:
clang++ test.cpp -O3 -g -fno-inline -std=c++11 -Wall
它没有任何警告形式,尽管如果不使用C 11
这仅仅是因为std::string
接受const char*
的构造函数(链接中的数字(5))和分配运算符(链接中的数字(3)),因此nullptr
匹配。
在C 11之前(因此在nullptr
之前),当您尝试从0
或NULL
构造时,也会发生同样的问题。所有这些情况都是非法的,导致不确定的行为,尽管过去至少有一个STL(Roguewave?)接受了它并产生了一个空字符串。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我可以重新分配/覆盖std::字符串吗
- 为什么 std::equal_to会导致动态分配?
- 使 std::vector 分配对齐内存的现代方法
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- C++ 使用枚举类对象分配 std::map 值
- std::元组分配和复制/移动异常保证
- 使用 std::vector 在类中分配索引
- vector是否为std::移动的对象连续分配内存
- std::initializer_list 堆是否分配内存?
- std::p air 会破坏其动态分配的对象吗?
- 在std::线程中使用已分配的结构数据
- 无法使用"std::make_shared"分配指针
- std矢量内存分配linux与windows编译器
- 如何为包含最多N个元素的std::multiset调用最大数量分配
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- 如何使用 std::vector 防止内存重新分配
- 使用 std::map 的递归堆栈分配如何工作?
- 我可以使用std ::分配的分配的原始数组