为什么转换不能完成隐含

yua*_*uan 0 c++

由于没有进行转换,第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("%d\n",i5A);   
 15         //won't work,need explicit conversion 
 16         printf("%d\n",i5A.operator int()); 
 17         printf("%p\n",i5A.operator int*());
 18 return 0;
 19 }
Run Code Online (Sandbox Code Playgroud)

更新:
我知道为什么标准需要一个data()功能:printf("%d\n",*(i5A.data()));

Luc*_*ore 6

printf是一个原始而简单的功能.它不知道你传递给它的类型,更不用说如何转换它们.如果你指定"%d",它只会读取你传递的参数int,吐出并继续下一个参数.或崩溃.只是不要这样做.如果你做出承诺,保留它 - 这%d是你传递的承诺int.