命名空间在许多类似于没有构造函数的类,没有析构函数,没有继承,final,只有静态方法和成员。毕竟,这种类基本上只能用于命名空间的使用方式:声明和定义的命名范围。
...除了以上不是真的,因为类可以模板化 - 而名称空间不能。网站上有几个类似于“我可以模板化命名空间”的问题,但我想知道的是 - C ++标准委员会是否曾考虑过使命名空间变得模糊的提案?如果有,该提案被拒绝了吗?如果是的话,原因是什么?
答案 0 :(得分:1)
无法拥有template namespace
实际上只是它们与类不同的一种方式。其他的将是new namespace
和sizeof (namespace)
之类的东西 - 如果命名空间可以扩展到许多编译单元,编译器如何实现呢?
只关注模板命名空间...虽然有时很难跟上所有关于新C ++功能的提议,但我不记得曾经有人试图添加一个试图添加你所描述的功能的功能。
如果有人写一个提案,会不会考虑?正如Stroustrup在本次采访中指出的那样(http://www.stroustrup.com/devXinterview.html):
为了让C ++在未来几十年保持活力,这一点至关重要 标准C ++并未扩展到支持每个学术和商业 时尚。人们要求的大多数语言设施都可以充分利用 仅使用当前的C ++工具通过库解决。
正如你自己指出的那样,你所要求的基本上已经存在:只使用带有静态成员的模板化类。这似乎取消了它作为一个潜在的新功能的资格,至少在Stroustrup的眼中。
答案 1 :(得分:1)
如果名称空间可以模板化,ADL将如何工作?我们应该为ADL创建特殊的模板推理规则吗?
更重要的是,您是否可以通过演示无法填充的用例来证明语言的复杂性,仅使用静态成员制作模板struct
?如果模板命名空间就像一个gimped模板结构,那似乎并不十分引人注目。
另外。我知道你对关于命名空间/模板混合的其他问题并不满意,但这个答案中的一点似乎与你的问题有关:
Why can't namespaces be template parameters?
- 可能很难:命名空间不是一个完整的,自包含的实体。命名空间的不同成员可以在不同的头文件中声明,甚至可以在不同的编译单元中声明。
醇>
如果命名空间是模板,这甚至会如何工作?你能不能重新打开"您可以使用常规命名空间命名空间吗?如果允许,那么命名空间的实例化点是什么?
听起来它可能非常复杂。
另外:在您提出的功能之后,语言是否仍然可以轻松解析?
C ++中最令人烦恼的事情之一是在定义引用其他模板的模板时经常需要编写template
,以便解决语法中关于<
是否小于的问题的歧义运算符或模板参数列表。
3.4.5 [basic.lookup.classref] 在类成员访问表达式(5.2.5)中,如果是。或 - &gt;令牌后面紧跟着一个标识符,后跟一个&lt ;,必须查找标识符以确定&lt;是模板参数列表(14.2)或小于运算符的开头。首先在对象表达式的类中查找标识符。如果未找到标识符,则在整个postfix-expression的上下文中查找它,并命名一个类模板。如果对象表达式的类中的查找找到模板,则还会在整个后缀表达式的上下文中查找该名称,并且
- 如果找不到名称,则使用在对象表达式的类中找到的名称,否则使用
- 如果在整个postfix-expression的上下文中找到该名称并且未命名类模板,则使用在对象表达式的类中找到的名称,否则
- 如果找到的名称是一个类模板,它应该引用与在对象表达式的类中找到的实体相同的实体,否则该程序是不正确的。
如果名称空间可以是模板,那么每当您在template
运算符之后引用模板时,我们也不必为它们编写::
吗?出于同样的原因,foo::bar < 1 ...
可能是具有非类型模板参数的模板bar
内的命名空间模板foo
,或者它可能是1
与int foo::bar
的比较{1}}。
我们如何在第三种可能性之间消除歧义,foo
是命名空间,bar
是其中的常规类模板?