小编muk*_*nda的帖子

我可以取消引用 std::string.end() 吗?

我相信对此的常见反应是“不”,end()因为容器的迭代器表示“过去结束”地址,这是取消引用的未定义行为。我在标准中找不到一个明确的声明来免除字符串的约束,即使字符串比其他容器有特殊情况。

C++11 标准声明您可以读取超过字符串末尾的一个索引。string[size()]引用空终止符的只读值。

24.3.2.5 basic_string 元素访问 [string.access]

const_reference operator[](size_type pos) const;

reference operator[](size_type pos);

(1)要求: pos <= size() .

(2)回报: *(begin() + pos) if pos < size()。否则,返回对类型charT为 value的对象的引用 charT(),其中将对象修改为除charT()导致未定义行为之外的任何值。

front()被定义为等效于return operator[](0)which 等效return operator[](size())于一个空字符串。

end() - begin()被明确定义为字符串长度的差异,因此end()必须指向的索引size()才能定义该算术。

在上面的标准摘录中,它说明这operator[](pos)等效于*(begin() + pos)if pos < size()。它并不是说您可以取消引用begin() + size(),但您认为假设这应该被明确定义是否合理?或者更好的是,您是否知道一些证明可以将字符串迭代器从约束中排除?

另外,能否证明*(begin() + i)for …

c++ string std language-lawyer

9
推荐指数
1
解决办法
313
查看次数

引用未初始化的内存。未定义的行为?

首先,请允许我说,出于明显的原因,我不建议您采用以下任何一种做法。但是,我今天对此进行了讨论,有些人坚持使用像这样的引用作为未定义的行为。

这是一个测试案例:

#include <string>

struct my_object {
   int a          = 1;
   int b          = 2;
   std::string hi = "hello";
};

// Using union purely to reserve uninitialized memory for a class.
union my_object_storage {
   char dummy;
   my_object memory;
   // C++ will yell at you for doing this without some constructors.
   my_object_storage() {}
   ~my_object_storage() {}
} my_object_storage_instance;

// This is so we can easily access the storage memory through "I"
constexpr my_object &I = my_object_storage_instance.memory;

//-------------------------------------------------------------
int main() {
   // Initialize …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

7
推荐指数
1
解决办法
159
查看次数

Boost.Asio SSL线程安全

我是否创建了一个所有 SSL套接字共享的链,或者每个SSL上下文一个链(由任何相关的套接字共享)?

Boost.Asio SSL文档声明了这一点,但它没有提到上下文.我认为这意味着我必须只使用一个链,但我认为这是在OpenSSL支持多线程之前编写的.

SSL和线程

SSL流对象不执行自己的锁定.因此,必须在隐式或显式链中执行所有异步SSL操作.请注意,这意味着在单线程程序中不需要同步(因此不会产生锁定开销).

我很可能只有一个SSL上下文,但我想知道这个链是由SSL上下文还是全局网络服务所拥有的更合适.

我确实提供了一个处理程序CRYPTO_set_locking_callback,以防万一.

c++ multithreading boost openssl boost-asio

6
推荐指数
2
解决办法
1824
查看次数

如何在给定的字符串中查找字母序列?

我的字符串是"AAABBAABABB",我想得到结果

A = 3
B = 2
A = 2
B = 1 
A = 1
B = 2
Run Code Online (Sandbox Code Playgroud)

我试过用

for (int i = 0; i < n - 1; i++) {
    if (msg[i] == msg[i + 1]) {
        if(msg[i]==A)
            a++;
        else
            b++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过它对我不起作用。而且我不明白是否还有其他方法可以找到它。请帮帮我。

c++ algorithm c++11 c++14 c++17

3
推荐指数
1
解决办法
158
查看次数