小编cpp*_*ast的帖子

访问std :: string中的元素,其中string的位置大于其大小

在std :: string的情况下,如果我们访问一个元素,其中(element position) == (size of string)标准表示该元素返回对charT具有value 类型的对象的引用charT()

const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);
Run Code Online (Sandbox Code Playgroud)

期望:pos <= size()。

如果pos <size(),则返回*(begin()+ pos)。否则,返回对具有值charT()的charT类型的对象的引用,在该引用中,将该对象修改为charT()以外的任何值都将导致未定义的行为。

http://eel.is/c++draft/strings#string.access-1

不幸的是,我无法对此做出解释,如果它是Undefined Behavior,那就更好了。

有人可以解释其背后的原理吗?

c++ string language-lawyer c++11

36
推荐指数
3
解决办法
2036
查看次数

为什么lambda的call-operator隐式为const?

我在下面的函数中有一个小的"lambda表达式":

int main()
{
    int x = 10;
    auto lambda = [=] () { return x + 3; };
}
Run Code Online (Sandbox Code Playgroud)

下面是为上面的lambda表达式生成的"匿名闭包类".

int main()
{
    int x = 10;

    class __lambda_3_19
    {
        public: inline /*constexpr */ int operator()() const
        {
            return x + 3;
        }

        private:
            int x;

        public: __lambda_3_19(int _x) : x{_x}
          {}

    };

    __lambda_3_19 lambda = __lambda_3_19{x};
}
Run Code Online (Sandbox Code Playgroud)

由编译器生成的闭包"operator()"是隐式const.为什么标准委员会const默认做到这一点?

c++ lambda const c++11 function-call-operator

20
推荐指数
2
解决办法
1456
查看次数

Lambda闭包类型构造函数

cppreference表明,对于拉姆达闭合类型构造不同的规则。

默认构造-直到C ++ 14

ClosureType()=删除;(直到C ++ 14)

闭包类型不是默认可构造的。闭包类型的默认构造函数已删除(直到C ++ 14)否(自C ++ 14起)。

默认构造-自C ++ 14起

闭包类型没有(自C ++ 14起)默认构造函数。

默认构造-自C ++ 20起

如果未指定捕获,则闭包类型具有默认的默认构造函数。否则,它没有默认构造函数(包括捕获默认值,即使它实际上没有捕获任何内容也是如此)。

复制分配运算符-直到C ++ 20

副本分配运算符定义为已删除(并且未声明移动分配运算符)。闭包类型不是CopyAssignable。

复制分配运算符-自C ++ 20起

如果未指定捕获,则关闭类型具有默认的副本分配运算符和默认的移动分配运算符。否则,它具有已删除的副本分配运算符(包括存在捕获默认值的情况,即使它实际上没有捕获任何内容也是如此)。

规则变更的原因是什么?标准委员会是否确定了lambda封闭式构造标准的不足之处?如果是这样,那些短处是什么?

c++ lambda c++11 c++20

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

将std :: wcout和std :: cout混合会出错,这是怎么回事?

使用g ++进行编译后,下面的程序std::wcout仅显示表达式。但是,如果您取消注释第八行,它将正确打印三个表达式。

我想知道这种奇怪行为的原因。

#include <iostream>
#include <cstring>
#include <boost/format.hpp>

int main () {
  int x = 10; 
  wchar_t str[] = L"Hello, world!";
//  std::cout << "what?" << std::endl;
  std::wcout << L"str = \"" << str << L"\" | len = " << wcslen(str) << L"\n";
  std::cout << boost::format("x = %d | &x = %p") % x % &x << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ cout widechar

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

C ++-来自std :: string的意外输出

我正在写一个返回字符串的函数。但是发生了一些奇怪的事情。result字符串的输出从控制台打印为意外内容。

根据机器(测试),它会变成中文或其他名称或空字符串。但这仅在输入字符串超长时发生。它通常适用于较小的字符串。

有没有更好的方法附加char到字符串?这是因为我怀疑问题是由我在字符串末尾添加字符的方式引起的。

从控制台

在此处输入图片说明

从调试器

在此处输入图片说明

main.cpp

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

bool checkPalindrome(string s)
{
    return (s == std::string(s.rbegin(), s.rend()));
}

string longestPalindrome(string s)
{
    if (s.size() > 1000 || s.empty())
        return "";

    string result = "";
    string sub = "";
    char* ptr = &sub[0];

    for (int i = 0; i < s.length(); ++i) {
        sub += s[i];
        while (true) {
            string temp = ptr;
            if (checkPalindrome(temp)) {
                ptr = …
Run Code Online (Sandbox Code Playgroud)

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

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

未评估上下文中的lambda(直到C ++ 20)

我目前正在阅读P0315R1文章,该文章讨论了评估背景下的Lambda。

该文档中有一条语句解释了为什么lambda不能在未评估的上下文中出现(当然,只有在C ++ 20之前),如下所示:

Lambda是一种非常强大的语言功能,尤其是在使用带有自定义谓词的高阶算法或表示小的可抛弃的代码段时。然而,它们遭受了一个重要的局限性,这限制了它们对创造性用例的实用性。它们不能出现在未经评估的环境中。此限制最初旨在防止lambda出现在签名中,因为lambda必须具有唯一的类型,否则该签名可能会打开一罐蠕虫进行处理。

有人可以举例说明这个说法吗?

c++ lambda c++11 c++20

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

返回一个const char*

我做了一个回复当前日期的函数.在函数内部,我"cout"结果并且它工作但是当我"cout"函数时,它不起作用.我得到了垃圾.

const char* engineCS::getDate() const
{
    time_t t = time(0);
    struct tm *now = localtime(&t);
    char buf[20];
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", now);
    cout << buf << endl;
    return buf;
}
Run Code Online (Sandbox Code Playgroud)

例子:内部:2012-02-02 00:00:00外:????? fv

怎么了?类似的问题:函数和返回const char*

谢谢

编辑:现在有什么问题?对不起,我做了太多的VB.NET ...

const char* engineCS::getDate() const
{
    time_t t = time(0);
    struct tm *now = localtime(&t);
    char *buf;
    buf = new char[20];
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", now);
    cout << buf << endl;
    return buf;
}
Run Code Online (Sandbox Code Playgroud)

c++ const function char

0
推荐指数
1
解决办法
4508
查看次数

对于std :: vector,析构函数被调用两次,优化级别为0

我正在尝试使用编译器资源管理器了解std::vector为其及其emplace_back (or) push_back函数生成的汇编代码.

注意:优化级别为0,即使用-O0

我无法理解的一件事是,为什么有两个析构函数被调用而不是一个(因为你可以看到只创建了一个向量.如果我假设一个临时对象是在内部创建的,那么我必须看到对std::vector构造函数的调用.

这与clang编译器也是一样的.

有人可以解释一下这里发生了什么吗?

编辑1:

#include <vector>
int main()
{
    std::vector<int> vec;
    vec.emplace_back(10);
}
Run Code Online (Sandbox Code Playgroud)

编辑2:删除屏幕截图,因为它很难阅读.

c++ vector c++11

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