为什么无法隐式转换

why conversion can't be done implicite

本文关键字:转换 为什么      更新时间:2023-10-16

第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并打印每个元素。

相关文章: