20231017 基础 C++题目
题目
1.下面展示的代码的行为是
C++
#include <iostream>
#include <type_traits>
template<typename T>
bool foo(T* param) {
return std::is_same<T*, char *>::value;
}
int main() {
char arr[]{"Hello, World!"};
std::cout << foo(arr);
}
- A. 无法编译/未定义行为
- B. 可编译,保证输出"0"
- C. 可编译,保证输出"1"
- D. 可编译,输出为实现定义
2.下面展示的代码的行为是
C++
#include <iostream>
#include <type_traits>
template<typename T>
bool foo(T& param) {
return std::is_same<T&, char &>::value;
}
int main() {
char arr[]{"Hello, World!"};
std::cout << foo(arr);
}
- A. 无法编译/未定义行为
- B. 可编译,保证输出"0"
- C. 可编译,保证输出"1"
- D. 可编译,输出为实现定义
3.下面展示的代码的行为是
C++
#include <iostream>
template<typename T>
size_t foo(T param) {
return sizeof(param);
}
template<typename T>
size_t foo(T & param) {
return sizeof(param);
}
int main() {
char arr[2];
std::cout << foo(arr) == sizeof(arr);
}
- A. 无法编译/未定义行为
- B. 可编译,保证输出"0"
- C. 可编译,保证输出"1"
- D. 可编译,输出为实现定义
4.下面展示的代码的行为是
C++
#include <iostream>
#include <type_traits>
template<typename T, typename U>
bool foo(T param1, U param2) {
return std::is_same<T, U>::value;
}
int main() {
char arr[]{"Hello, World!"};
const char * str = "Hello, World!";
std::cout << foo(arr,str);
}
- A. 无法编译/未定义行为
- B. 可编译,保证输出"0"
- C. 可编译,保证输出"1"
- D. 可编译,输出为实现定义
5.下面展示的代码的行为是
C++
#include <iostream>
#include <type_traits>
extern char arr[];
template<typename T>
bool foo(T & param1, char param2[]){
return std::is_same<T, decltype(param2)>::value;
}
int main() {
std::cout << foo(arr, arr);
}
char arr[] = "Hello, World";
- A. 无法编译/未定义行为
- B. 可编译,保证输出"0"
- C. 可编译,保证输出"1"
- D. 可编译,输出为实现定义
答案
- C
- B
- A
- B
- B
解析
- 基本的数组退化现象,
param
的类型为char*
,T*
会推导为char*
,std::is_same<T*, char *>::value
为true
。 - 没有
T*
形式的推导的时候,T&
会推导为char (&)[13]
,std::is_same<T&, char &>::value
为false
。 - 此处
foo(T param)
会推导为foo(char * param)
,foo(T¶m)
会推导为foo(char (&)[2])
,这里是相同优先级的转换,导致重载决议冲突,无法编译。 arr
的类型为char[13]
,退化得到的是char*
,str
的类型为const char*
,std::is_same<T, U>::value
为false
。- 此处
arr
是 unbounded array,param1
的类型会推导得到数组的引用,T
是数组类型,而param2
是指针类型,std::is_same<T, decltype(param2)>::value
为false
。