c++ - 在 std 命名空间中重载(非特化)模板

标签 c++ c++11 std language-lawyer

这是非常迂腐的,但在 C++03 中,程序重载(而不是专门化)显然是不符合中的模板函数的std 命名空间:参见此 here 的提及和 long discussion on comp.lang.c++.moderated

即这没关系:

namespace std
{
    template <>
    void swap (Foo & f, Foo & g)
    {
       // ...
    }
}

但事实并非如此(如果我理解正确...):

namespace std
{
    template <typename T>
    void swap (TempateFoo<T> & f, TempateFoo<T> & g)
    {
       // ...
    }
}

在 C++11 中仍然如此吗?此外,这是否也适用于模板类(如 std::hash),还是仅适用于模板函数?

编辑:还有,是否有任何标准库实现的例子,使得后者在实践中会破坏事物?如果不是,是否有像上面第二种情况那样不允许重载的特定原因? (理论上可能会破坏什么?)

最佳答案

不可能在 C++ 中定义函数模板的部分特化,因此您的第二个示例定义了重载不是特化。由于标准只允许将特化添加到命名空间 std,因此您的重载是非法的。

Is this still true in C++11?

是的。

Also, does this apply to template classes (like std::hash) too, or just template functions?

无论如何你都不能重载类模板,你只能重载函数。但是,同样的规则适用,如果特化依赖于用户定义的(即非标准的)类型,则只能特化类模板。

is there a specific reason for disallowing overloads like in the second case above? (what could potentially break in theory?)

举个例子,实现可能想要获取一个函数的地址,但是如果你重载了这个函数,那么获取地址可能会导致歧义并无法编译,这意味着你刚刚破坏了标准中的有效代码图书馆。

关于c++ - 在 std 命名空间中重载(非特化)模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104760/

相关文章:

c++ - 自动链接静态库的依赖项

c++ - std::lock_guard() 用于锁定的 std::mutex

c++ - 找不到最新插入 std::map 的 key

c++ - std::map 中的项目是否永远保持在同一个地址?

c++ - 如何获取 Apple/Mac 上的可用虚拟内存量?

c++ - 使用 doxygen 记录 C++ 概念?

c++ - 断言被调用以返回 & 的函数的签名(引用)

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?

c++ - C++ 11-修改结构 vector 中的结构成员

c++ - 从 unordered_map 获取键和值列表