C++中的内部链接属性。。。

template <char const* name>
class MyClass {

};
char const* s = "hello";
MyClass<s> x; // ERROR: s is pointer to object with internal linkage
这里"hello"是个内部链接(internal linkage)对象
但是:
template <char const* name>
class MyClass {

};
extern char const s[] = "hello";
MyClass<s> x; // OK


(1)  "hello"是字符串常量,因为不是“变量”,所以没有内部、外部链接属性。有内部外部链接属性的是那个s。
(2)  C++规定,有const修饰的变量,不但不可修改,还都将具有内部链接属性,也就是只在本文件可见。(这是原来C语言的static修饰字的功能,现在const也有这个功能了。)又补充规定,extern const联合修饰时,extern将压制const这个内部链接属性。于是,extern char cosnt s[]将仍然有外部链接属性,但是还是不可修改的。

(3)  1.char const* s = "hello";
  MyClass<s> x; // ERROR: s is pointer to object with internal linkage

我不知道lz标注的error信息是怎样得到的,在vs2005下的错误信息是:
invalid template argument for 'MyClass', expected compile-time constant expression
主要原因在于template是在编译时就生成的,而s是一个指针变量,它的值是运行时可知。

(4)    一下这段话是原作者的感悟,本人有些不是很理解,但是也暂时摘录在此。

nontype template parameters要求是在编译或者链接时值必须是可知的。对于内部链接对象来说,对于其他编译单元不可见,而在编译期至少模板的实例化是共享的(blue_zyb说的我很认同),但是如果内部链接对象可以作为template argument(模板实参)会发生语义上的错误,例如字符串文字量(如“abcx”,前面我说是字符串常量,这种称法不准确)
他传递给模板的是个指针,而非他的值("abcx").况且如果还有一个"abcx"的话,也是传递的是地址,并且这两个地址从理论上说是不相同的(即使某些编译器会做优化,让其相同)。
但是他对我们用户来说不相同。但同时我们要说两个字符串文字量的值是相同的。应该共享一个类的定义(注:这是我们使用者的角度来谈),而实际上编译器无法以值的
方式传递这种常量,而以地址的方式传递常量。这样如果编译器生成了不同的类的实现,这就违法了模板给我的信息(相同值的非类型类型『nontype template parameters』模板参数生成的对象是共享一个实例的类的),因此编译器不应该生成相应的类的实现。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sophia_sy/archive/2007/02/10/1507077.aspx

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值