未命名的命名空间中未命名的类的实例

时间:2017-06-28 16:12:40

标签: c++ visual-c++-2013 unnamed-namespace unnamed-class

使用带参数的仿函数通常如下:

// Definition:
struct some_functor_with_params
{
    int ref;
    explicit some_functor_with_params(int ref) : ref(ref) {}
    bool operator ()(int i) const {return i == ref;}
};

// Usage:
std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_with_params(42));

对于没有参数的仿函数,代码可能会变为

// Definition:
struct some_functor_without_params
{
    bool operator ()(int i) const {return i == 42;}
};

// Usage:
std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_without_params());

但我更喜欢以下用法:

std::vector<int> v;
std::find_if(v.begin(), v.end(), some_functor_without_params); // no parens

具有以下优点:

  • 更简洁
  • 直接调用仿函数时更具可读性:some_functor_without_params(i)而不是some_functor_without_params()(i)
  • 可与函数互换:bool some_functor_with_params(int i) {return i == 42;}

我在头文件中以下列方式实现它:

namespace {
    struct
    {
        bool operator ()(int i) const {return i == 42;}
    } some_functor_without_params;
}

我认为结构不需要名称,因为它没有用户声明的构造函数(也没有析构函数,也没有任何需要结构名称的东西)。我将对象放在一个未命名的命名空间中,以便每个编译单元都有自己的some_functor_without_params,并且没有&#39;双重定义&#39;链接错误。

是否有任何性能损失或任何其他我看不到的缺点?

这种方法按预期工作,直到我遇到一个非常奇怪的编译错误,Visual C ++ 2013在命名仿函数类型时消失了,即替换

struct
{
    bool operator ()(int i) const {return i == 42;}
} some_functor_without_params;

struct some_functor_without_params_t
{
    bool operator ()(int i) const {return i == 42;}
} some_functor_without_params;

错误仅发生在Debug中,而不是发布中,并且状态为

error C2039: '<unnamed-type-some_functor_without_param>': is not a member of 'my_namespace:: ?? A0xbf2cc73f'

在文件xstring中,此处:

_Myt& operator+=(const _Elem *_Ptr)
    {   // append [_Ptr, <null>) // <-- on this line(!)
    return (append(_Ptr));
    }

它看起来像编译器错误,你怎么看?

0 个答案:

没有答案