为什么无法隐式转换
why conversion can't be done implicite
第14行的代码无法编译,因为没有进行转换,但第16,17行的代码可以正常运行,因为显式转换操作符。
1
2 #include <iostream>
3 using namespace std;
4 template<typename T,int N>class Array{
5 private:
6 T _M_data[N];
7 public:
---- operator T*(){return _M_data;}
---- operator T(){return _M_data[0];}
++++ T* data(){return _M_data;}
10 };
11 int main(int argc,char*argv[])
12 {
13 Array<int,5> i5A ;
14 //printf("%dn",i5A);
15 //won't work,need explicit conversion
16 printf("%dn",i5A.operator int());
17 printf("%pn",i5A.operator int*());
18 return 0;
19 }
更新:
我知道为什么标准需要data()
函数:printf("%dn",*(i5A.data()));
printf
是一个原始而简单的函数。它不知道你传递给它的是什么类型,更不用说如何转换它们了。如果您指定"%d"
,它将读取您作为int
传递的参数,吐出它并继续执行下一个参数。或崩溃。千万别这么做。如果你做了一个承诺,遵守它——%d
是你传递给int
的承诺。
不能隐式地进行转换,因为在像printf
这样的可变变量函数中,格式字符串在运行时由printf
的内部解析,而可变参数检索则由printf
的内部在运行时执行。对于编译器,"%dn"
只是一个字符串。编译器不解析格式字符串,也不知道如何解释该格式字符串,因此它不知道实参是否需要转换,也不知道将其转换为哪种类型。
注:有些编译器能够从标准函数(如printf
)的格式字符串中检索信息。他们这样做纯粹是为了检查错误。将这些知识用于隐式参数转换在技术上是可能的,但它会产生相当深远的非标准特性。这样的特性在c++中没有立足之地。当然,只有在编译时实际知道该字符串时,才能对格式字符串进行编译时解析,但情况并非总是如此。
在第13行,没有隐式转换。字符串格式不会改变传入对象的类型。
printf
是一个变参数函数。varargs函数的参数类型没有指定,因此无法知道应该将参数转换为哪种类型。对于一些基本类型有一些默认的转换(例如布尔型转换为整型)。但是用户定义的转换不会隐式地完成。
传递给printf的格式字符串指定了十进制整数,但传递的是Array。您需要传递一些可以转换为int型(或者更好的是,实际的int型)的数字类型。如果您想打印多个值,您可能需要遍历Array并打印每个元素。
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 为什么g++在未执行的代码处标记强制转换错误
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 为什么我收到"从常量指针到指针的转换无效?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么即使我没有进行转换,此代码中也有转换?
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 为什么下面带有非常量转换函数的代码没有歧义?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 为什么此指针值不能转换为整数的规则是什么?
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 在 OS X 上的 ifconfig.h 的 ifadder 结构中,我可以将ifa_data转换为什么?
- 双精度到浮点型转换 -- 为什么我不能将 (双精度)20150813.00 转换为 (浮点型)20150813.00?
- c++隐式转换:为什么字面字符串要转换为字符串
- Reg 文件 - "dword"转换为什么?