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。