C++的隐式转换和explicit关键字
1 class T
2 {
3 public:
4 T(int t){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10 int main()
11 {
12 T t(3);
13 foo(3); //此时会将3隐式转换为T
14
15 return 0;
16 }
17
通explicit关键字可以禁止这种隐式转换2 {
3 public:
4 T(int t){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10 int main()
11 {
12 T t(3);
13 foo(3); //此时会将3隐式转换为T
14
15 return 0;
16 }
17
1 class T
2 {
3 public:
4 explicit T(int t){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10
11 int main()
12 {
13 T t(3);
14 foo(3); //编译器报错error: conversion from ‘int’ to non-scalar type ‘T’ requested
15
16 return 0;
17 }
看到过说对有多个参数的构造函数使用explicit是个语法错误。2 {
3 public:
4 explicit T(int t){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10
11 int main()
12 {
13 T t(3);
14 foo(3); //编译器报错error: conversion from ‘int’ to non-scalar type ‘T’ requested
15
16 return 0;
17 }
但是用gcc好像这样不报错
g++ -O2 -Wall -o tt tt.cpp
1 class T
2 {
3 public:
4 explicit T(int t, int s){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10
11 int main()
12 {
13 T t(3, 4);
14 return 0;
15 }
16
2 {
3 public:
4 explicit T(int t, int s){}
5 };
6 void foo(T t)
7 {
8 return;
9 }
10
11 int main()
12 {
13 T t(3, 4);
14 return 0;
15 }
16