英文:
Unexpected result from std::wstring::resize_and_overwrite
问题
这个程序的输出似乎与您在cppreference.com上引用的文档不符。根据文档,resize_and_overwrite
应该评估std::move(op)(p, count)
,并且i和c的值应该始终相同。但是,根据您提供的输出,某些迭代中i和c的值不同。这可能是由于一些未定义的行为导致的。
您的代码在循环中调用resize_and_overwrite
函数,并且似乎使用了lambda函数来执行某些操作。问题可能出现在lambda函数内部,可能与lambda函数的捕获列表或执行逻辑有关。为了解决这个问题,您可能需要仔细检查lambda函数的实现,确保它按预期工作并正确处理传递给它的参数。
另外,确保您的编译器和编译标志与您在GodBolt上看到的输出相同,因为不同的编译器或编译标志可能会导致不同的行为。
最后,如果问题仍然存在,您可能需要查看C++标准库的实现,以了解resize_and_overwrite
函数的确切行为,以确定是否存在任何特定于库实现的问题。
英文:
this program
#include <iostream>
#include <string>
int main()
{
std::wstring ws;
for(unsigned i=1;i<64;++i){
std::cout<<i<<' ';
ws.resize_and_overwrite(i,[](wchar_t*s,size_t c){std::cout<<c<<'\n';return 0;});
}
return 0;
}
outputs
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 14
9 9
10 10
11 11
12 12
13 13
14 14
15 28
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 56
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 50
51 51
52 52
53 53
54 54
55 55
56 56
57 112
58 58
59 59
60 60
61 61
62 62
63 63
However, according to the doc https://en.cppreference.com/w/cpp/string/basic_string/resize_and_overwrite,
2. Evaluates std::move(op)(p, count).
the values of i and c should always be the same. What is wrong with the code, did I miss something? I guess there must be some undefined behavior at work. The output in https://godbolt.org/ is not the same as that of my PC, but i and c are still different in some iterations.
答案1
得分: 7
您的程序具有明确定义的行为,并且根据当前的C++23草案应始终在每一行上产生相等的值。
您看到的行为是由于libstdc++不符合当前的C++23草案。关于这个问题已经存在一个错误报告 这里。
正如错误报告中所述,意图(在我看来似乎是合理的)可能是让用户调用的函数至少有时提供有关分配的实际大小的信息,以便它可以潜在地使用已经分配的额外空间。然而,这不符合标准草案。我不知道Jonathan Wakely是否打算使libstdc++符合标准,还是提议修改标准。我在https://cplusplus.github.io/LWG/lwg-index.html上没有找到任何匹配的开放LWG问题。
英文:
Your program has well-defined behavior and should always produce equal values on each line according to the current C++23 draft.
The behavior you see is due to libstdc++ being non-conforming to the current C++23 draft. A bug report for this already exists here.
As stated in the bug report, the intention (which seems reasonable to me) might have been that the user-callable is (at least sometimes) given information about the actual size of the allocation that way, so that it can potentially use that extra space that is already allocated. However, this is not conforming to the standard draft. I don't know whether Jonathan Wakely intents to make libstdc++ conforming or instead to propose adapting the standard. I didn't find any matching open LWG issue at https://cplusplus.github.io/LWG/lwg-index.html.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论