Skip to content

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. 可编译,输出为实现定义

答案

  1. C
  2. B
  3. A
  4. B
  5. B

解析

  1. 基本的数组退化现象,param 的类型为 char*T* 会推导为 char*std::is_same<T*, char *>::valuetrue
  2. 没有 T* 形式的推导的时候,T& 会推导为 char (&)[13]std::is_same<T&, char &>::valuefalse
  3. 此处 foo(T param) 会推导为 foo(char * param)foo(T&param) 会推导为 foo(char (&)[2]),这里是相同优先级的转换,导致重载决议冲突,无法编译。
  4. arr 的类型为 char[13],退化得到的是 char*str 的类型为 const char*std::is_same<T, U>::valuefalse
  5. 此处 arr 是 unbounded array,param1 的类型会推导得到数组的引用,T是数组类型,而 param2 是指针类型, std::is_same<T, decltype(param2)>::valuefalse