首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免在std::pair中“隐式”调用单参数构造函数

如何避免在std::pair中“隐式”调用单参数构造函数
EN

Stack Overflow用户
提问于 2011-11-15 19:20:04
回答 1查看 398关注 0票数 17

最初的问题是如何以安全的方式使用std::map<std::wstring, std::wstring> >,因为相同类型的键和值非常容易出错。所以我决定为值创建一个简单的包装器:

代码语言:javascript
复制
    struct ComponentName
    {
      std::wstring name;

      // I want to prohibit any implicit string-ComponentName conversions!!!
      explicit ComponentName(const std::wstring& _name) : name(_name)
      {
      }

      bool operator<(const ComponentName& item_to_compare) const
      {
        return name < item_to_compare.name;
      }
    };

    typedef std::map<std::wstring, ComponentName> component_names_map;

但是下面的代码运行得很好!

代码语言:javascript
复制
component_names_map component_names;
// Are you sure that ComponentName's constructor cannot be called implicitly? ;)
component_names_map::value_type a_pair = std::make_pair(L"Foo", L"Bar");

它之所以有效,是因为std::pair<std::wstring, ComponentName>复制构造函数显式地使用ComponentName的字符串构造函数来分配std::pair<std::wstring, std::wstring>实例。这是一个绝对合法的行动。然而,它看起来像是对ComponentName构造函数的“隐式”调用。

所以我知道问题的原因,但是我如何避免这种“隐式”的wstring-ComponentName转换呢?最简单的方法是不声明字符串构造函数,但这会使ComponentName初始化变得不方便。

EN

回答 1

Stack Overflow用户

发布于 2011-11-15 20:00:22

简单:

代码语言:javascript
复制
enum FromString { fromString };

ComponentName( FromString, std::wstring const& aName)
    : name( aName )
{}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8135555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档