spr*_*aff 15 c++ templates iterator stdmap c++-standard-library
我有此代码,它适用于GCC:
#include <map>
class Foo;
class Bar;
typedef std::map<Foo,Bar> MyMap;
MyMap::iterator i;
class Foo
{
MyMap::iterator some_data;
};
Run Code Online (Sandbox Code Playgroud)
当前设计的代码(令人讨厌的是,是的,是我一直坚持使用的代码)要求map<Foo,Bar>::iterator可用于Foo和Bar。
之所以起作用,是因为GCC库实现恰好不需要实例化地图的键类型来实例化迭代器。
这样可以保证吗?在定义映射迭代器类型时,该标准似乎有些过时。该代码的移植性如何?
这会导致未定义的行为。
在声明中MyMap::iterator i;,MyMap要求是一个完整的类型,因此它是隐式实例化的。但是,Foo和Bar在实例化时尚未完成,因此根据[res.on.functions]/2未定义行为:
特别是,在以下情况下效果未定义:
- ...
- 如果在实例化模板组件或评估概念时使用不完整类型([basic.types])作为模板参数,除非该组件特别允许。