在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,那就更好了。
有人可以解释其背后的原理吗?
我在下面的函数中有一个小的"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默认做到这一点?
该cppreference表明,对于拉姆达闭合类型构造不同的规则。
默认构造-直到C ++ 14
ClosureType()=删除;(直到C ++ 14)
闭包类型不是默认可构造的。闭包类型的默认构造函数已删除(直到C ++ 14)否(自C ++ 14起)。
默认构造-自C ++ 14起
闭包类型没有(自C ++ 14起)默认构造函数。
默认构造-自C ++ 20起
如果未指定捕获,则闭包类型具有默认的默认构造函数。否则,它没有默认构造函数(包括捕获默认值,即使它实际上没有捕获任何内容也是如此)。
复制分配运算符-直到C ++ 20
副本分配运算符定义为已删除(并且未声明移动分配运算符)。闭包类型不是CopyAssignable。
复制分配运算符-自C ++ 20起
如果未指定捕获,则关闭类型具有默认的副本分配运算符和默认的移动分配运算符。否则,它具有已删除的副本分配运算符(包括存在捕获默认值的情况,即使它实际上没有捕获任何内容也是如此)。
规则变更的原因是什么?标准委员会是否确定了lambda封闭式构造标准的不足之处?如果是这样,那些短处是什么?
使用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) 我正在写一个返回字符串的函数。但是发生了一些奇怪的事情。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) 我做了一个回复当前日期的函数.在函数内部,我"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) 我正在尝试使用编译器资源管理器了解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:删除屏幕截图,因为它很难阅读.