gpt4 book ai didi

C++ 对包含引用的对 vector 的奇怪行为

转载 作者:太空狗 更新时间:2023-10-29 20:11:45 24 4
gpt4 key购买 nike

我刚刚发现了一些非常奇怪的东西,看看这段代码:

#include <cstring>
#include <cstdio>
#include <utility>
#include <vector>

using namespace std;

class A {
public:
int n = 0;
A(const char* p) { n = strlen(p); };

A(A const&) = delete;
void operator=(A const&) = delete;
};
void F(vector<pair<const char*, const A&>> v) {
printf("F\n");
for(vector<pair<const char*, const A&>>::iterator it = v.begin();it!=v.end();++it) printf(" '%s': %p %i\n", it->first, &it->second, it->second.n);
};

int main(int, char**) {
F({
{ "A", "A" },
{ "B", "BB" },
{ "C", "CCC" },
{ "D", "DDDD" }
});
};

现在用clang++ -std=c++11 -Wall -Wextra -Wpedantic -O0 main.cc -o main编译它,或类似的东西(禁用优化)。

你应该看到这样的输出:

F
'A': 0x7fff57a0b988 1
'B': 0x7fff57a0b9d0 2
'C': 0x7fff57a0ba18 3
'D': 0x7fff57a0ba60 4

这很好,编译器会自动创建 vector 对象和相应的 A&引用文献,它们都是不同的。

现在,用 clang++ -std=c++11 -Wall -Wextra -Wpedantic -O1 main.cc -o main 编译它,请注意我是如何添加最低级别的优化的。

你会看到,

F
'A': 0x7fff5ac54b30 1629262454
'B': 0x7fff5ac54b30 1629262454
'C': 0x7fff5ac54b30 1629262454
'D': 0x7fff5ac54b30 1629262454

所有参数引用相同的 A&对象,我发现这是错误的。

这是我的编译器详细信息:

Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

这是预期的行为吗?这是编译器错误吗?

更新:正如 Matt McNabb 所指出的,vectors 和 initializer_lists 并非设计用于 const 引用(尽管它在 clang 中编译得很好)。但是,当编写与 void F(vector<pair<char*, A&&>>) {} 相同的函数时错误仍然存​​在。

最佳答案

您的代码似乎有点奇怪。你这样做:

void F(vector<pair<const char*, const A&>> v) {

因此,您期待一个包含对 A 对象的引用的 vector 。但是您没有任何 A 对象。您正在向它传递字符串文字,编译器为此隐式创建 A 对象 - 但这些是临时的,因此当您的函数主体运行时,它们已经消失,并且引用它们是未定义的行为,这就是它与 - O0,但不是 -O1。

如果要隐式创建A 对象然后保留它们,则不能使用引用。尝试

void F(vector<pair<const char*, const A>> v) {

此处示例:http://ideone.com/VNIgal

关于C++ 对包含引用的对 vector 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31599563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com