小编Ant*_*cus的帖子

std :: map ::在C++中插入更改17

我看到insert的方法std::map,并std::unordered_map打算从改变

template<class P> std::pair<iterator,bool> insert(P&& value); (C++11)
Run Code Online (Sandbox Code Playgroud)

std::pair<iterator,bool> insert(value_type&& value);  (C++17)
Run Code Online (Sandbox Code Playgroud)

但是,对于这些容器,value_typestd::pair<A const, int>.这里有两个问题:

  1. 为何如此改变?有什么好处?
  2. 如何在插入时移动密钥?C++ 11版本接受任何东西(对Pis 的约束default_constructible<value_type, P&&>),然后std::pair<A, int>- 这是大多数时候这个参数的类型,因为它是返回的std::make_pair- 并且可以调用它的移动构造函数A.但是在C++ 17版本中,这个参数被转换为value_type,其中A是const,然后是不可移动的.如果我没有忽略某些东西,则必须复制.或者C++ 17也改变了这方面的任何东西?

谢谢!

c++ stl move c++11 c++17

12
推荐指数
1
解决办法
836
查看次数

为什么 C++11 中 std::string 没有 const char* 强制转换运算符?

在C++03中,对于std::stringc_str()data()方法有不同的行为。

第一个返回一个以空结尾的字符数组,最后一个的管理完全依赖于实现。事实上,c_str() 可以返回指向另一个预分配缓冲区的指针,该缓冲区始终包含一个以 null 结尾的字符串,但这不是强制性的。然而,复杂性必须是恒定的。

第二个只是返回指向 的内部缓冲区的指针std::string,该缓冲区可以是空终止的,也可以不是。

因此,在 C++03 中,您可能会猜测强制转换运算符 toconst char*不是一个好主意。事实上,大多数时候,预期的行为是有一个以 null 结尾的 C 风格字符串,但是,由于 的实现c_str()可能会有所不同,因此强制转换运算符后面可能存在隐藏的开销。在另一种情况下,如果强制转换运算符返回与 相同的结果,可能会带来混乱data()

但是,对于 C++11,c_str()data()具有相同的行为。c_str()返回指向对象内部缓冲区的指针std::string。强制转换运算符 toconst char*不再含糊不清。std::string为什么C++11 中的类中没有此方法?

谢谢 !

c++ stl stdstring c++11

5
推荐指数
1
解决办法
1495
查看次数

C++标准对存储,局部变量的分配有何保证?

让我们考虑一下这个简单的C++代码:

struct vector3d { double x, y, z; };

void foo()
{
    vector3d v;
    ...
}
Run Code Online (Sandbox Code Playgroud)

C++对位置的评价是v什么?我的猜测是:什么都没有,这是有道理的,因为C++不应该为这些底层的内存概念而烦恼.

但是,如果C++标准没有谈论堆栈,堆和动态内存分配的具体概念,那么在这种情况下它如何保证编译器不会选择使用底层调用来转换此行malloc而不是经典sub rsp, X

如果它不能保证任何东西,C会保证某些东西(出于好奇)吗?是否所有C++开发人员普遍认为这将在堆栈中?

谢谢!

c++ memory standards

4
推荐指数
1
解决办法
169
查看次数

标签 统计

c++ ×3

c++11 ×2

stl ×2

c++17 ×1

memory ×1

move ×1

standards ×1

stdstring ×1