gpt4 book ai didi

C++ 模板不可理解的行为

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:09 28 4
gpt4 key购买 nike

首先 - 我知道这段代码很糟糕,它是用来试验模板的,但我真的不知道它是如何/为什么像它显示的那样工作的。

代码:

#include <iostream>
#include <vector>
#include <string>

template <typename T>
class Container {
public:
Container() {
std::cout << "Container()" << std::endl;
}
Container(const Container& other){
std::cout << "Container(const Container& other)" << std::endl;
}
template <typename A>
Container(const A& other) {
std::cout << "Container(const A& other)" << std::endl;
}
Container(const std::vector<int>& other) {
std::cout << "Container(const std::vector<int>& other)" << std::endl;
}
~Container() {
std::cout << "~Container()" << std::endl;
}
};

int main(){
Container<int> c1;
Container<int> c2(c1);
Container<int> c3(std::vector<int>());
Container<int> c4();
Container<int> c3(std::string());

return 0;
}

输出:

Container()
Container(const Container& other)
Container()
~Container()
~Container()
~Container()

问题是:

  1. 编译成功! (使用 -Wall、-Wextra 仅显示未使用的其他参数)为什么?
  2. 它运行了! (我可能期待一些 UB,但我不知道起源)。为什么?

这里发生了什么?为什么 c3 变量似乎被完全忽略了?我有一个小小的想法,也许它不能扩展模板,但为什么它在编译期间不会失败?

编译器:gcc 版本 4.8.1

最佳答案

因为两个c3变量实际上是函数声明(正如 Angew 在评论中指出的那样),您最终会声明重载函数。

您声明一个重载,它接受 std::vector<int>()参数和一个接受 std::string() 的参数范围。这两个重载不冲突,代码可以编译。

关于C++ 模板不可理解的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207335/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com