标准库容器与其他可选模板参数?(Standard Library Containers with a

2019-07-19 06:03发布

在文章读了要求多次 - 我想这个问题添加到#1,并要求社区 - 是下面的代码移植?

template<template<typename T, typename Alloc> class C>
void f() {
  /* some code goes here ... */
}

int main() {
  f<std::vector>();
}

是提供实施std::vector真的不允许有超越这两个众所周知的那些额外的,默认的模板参数? 这会使上面的代码中形成不良的,因为它假设两个模板参数。 见最后一段在这篇文章中对这种要求的一个例子。

Answer 1:

我发现了以下问题的报告 ,它说

没有歧义; 书面的标准是明确的。 库实现者不得模板参数添加到标准库类。 这不属于“仿佛”的规则,所以只有在标准明确了许可实施者要做到这一点,将被允许。 这就需要在标准的变化。

该LWG决定不进行此更改,因为它会破坏用户代码涉及模板模板参数或标准库类模板特殊化。

该说的实现可能会添加其他可选参数的书和人似乎是错误的。



Answer 2:

令人难以置信的是,我最近读“C ++模板:完全指南”,以及最后一本书标志着111页以下几点:

模板模板参数必须与完全匹配它替换模板模板参数的参数参数类模板。 一个模板的模板参数的默认模板参数被忽略(但如果该模板的模板参数具有默认参数,它们是模板的实例化过程中考虑)。

所以,如果这本书是要相信,你的例子,其中不规范的默认参数添加到标准::载体将是合法的 - 因为模板的模板参数的默认模板参数被忽略。

作为一个真正的世界的测试,我编译克以下++(成功)和Visual Studio 2008(失败了不匹配的参数):

template<typename T1, typename T2, typename T3 = float>
class MyClass
{
public:
    T1 v1;
    T2 v2;
    T3 v3;
};

template<template<typename T1, typename T2> class C>
void f()
{
    C<int,double> *c = new C<int,double>();
}

int main ()
{
    f<MyClass>();
    return 0;
}


Answer 3:

检查的17.4.4 [lib.conforming] subsubsections。

17.4.4.3/3说:“一个全球性的还是非成员函数不能被实现为采取额外的默认参数声明”,但17.4.4.4/2明确允许,只要有较长的更换描述成员函数签名作为附加参数有默认值。

还有的模板,虽然没有部分,因此,如果他们认为有必要提供17.4.4.3/3,似乎对我来说,额外的模板参数允许禁止措辞相反。



Answer 4:

我看到这个要求了。 但。

首先,我从来没有见过这样的实现。 我似乎记得安德烈Alexandrescu的使用像类固醇分配器类型一度考虑(类似my_fancy_thing<std::allocator,more_info_to_pass_to_the_container>而刚刚std::allocator ,仍能正常工作,太)。 但即使这样仍然会保持你的f()工作,这是最接近打破你的例子,我曾听过正在讨论的实现。

我认为这属于几乎同一类别的要求,一个0指针不一定必须由一个值来表示所有位设置为零-即使厂商真有这种自由(这我不知道,因为有双方的权利要求,也是如此),他们永远不会使用它,因为这会基本上打破了所有现有的代码。

所以,我早已决定不要担心。



文章来源: Standard Library Containers with additional optional template parameters?