我试图循环遍历一个映射表,但我得到了意外的副本。这是程序:
#include <iostream>
#include <map>
#include <string>
struct X
{
X()
{
std::cout << "default constructor\n";
}
X(const X&)
{
std::cout << "copy constructor\n";
}
};
int main()
{
std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
std::cout << "STARTING LOOP\n";
for (const std::pair<int, X>& p : numbers)
{
}
std::cout << "ENDING LOOP\n";
}
这里是输出结果:
default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor
copy constructor
copy constructor
ENDING LOOP
为什么在循环内部我会得到三个复制品?如果使用类型推断,这些复制品会消失:
for (auto&& p : numbers)
{
}
这里发生了什么事?
const pair<K, V>&
绑定到pair<const K, V>
?或者这会在常量正确性系统中留下漏洞吗?如果允许这样做,我会不会破坏任何东西? - fredoverflowconst
限定和非限定之间),这让我感到不安。 - Matthieu M.std::pair<X,Y>
与std::pair<T,U>
无关,除非X
恰好是T
,而Y
恰好是U
。你请求的绑定支持不能在语言层面上完成,因为它取决于模板的实现,可能会有一些专门针对const
类型的模板特化,在这种情况下,T<U>
的真实类型和占用空间可能完全不同于T<const U>
。 - David Rodríguez - dribeas