C++ 中的前瞻性析构函数
Prospective destructors in C++
我有这段代码,输出如下:
link到下面的例子
https://godbolt.org/z/z8Pn9GsTv
template <typename T>
struct A1 {
A1() {
std::cout << "construction of a1" << std::endl;
}
~A1() {
std::cout << "destruction of a1" << std::endl;
}
~A1() requires (std::is_same_v<T,int>) {
std::cout << "it is an int" << std::endl;
}
};
int main() {
A1 <int>a;
return 0;
}
输出:
construction of a1
destruction of a1
但是交换析构函数的位置会得到其他结果:
link 到代码
https://godbolt.org/z/vxj7dPqaj
template <typename T>
struct A1 {
A1() {
std::cout << "construction of a1" << std::endl;
}
~A1() requires (std::is_same_v<T,int>) {
std::cout << "it is an int" << std::endl;
}
~A1() {
std::cout << "destruction of a1" << std::endl;
}
};
输出:
construction of a1
it is an int
想知道这是一个错误吗?
在您的第二个代码中,
尝试改变这个:
A1 <int>a;
为此:
A1 <double>a;
你会得到输出:
construction of a1
destruction of a1 // With MSVC & GCC compiler
我在这里的解释是,当第一个构造函数(requires
)的条件失败时,将调用第二个构造函数,它打印 "destruction of a1"
并销毁 a
。
这确实是一个已报告的 Clang 错误1,如 by Quimby。
请注意,第二个片段(第一个带有约束析构函数的片段)在 Clang 中并没有真正“工作”,它只是忽略了第二个析构函数2.
另请注意,与 gcc 不同,在我撰写本文时,Clang 似乎尚未实现 [P0848R3](这是关于条件琐碎的特殊成员函数)3.
1) https://bugs.llvm.org/show_bug.cgi?id=50570
2) 参见示例:https://godbolt.org/z/rff7qfK65
3) 查看 feature test macro __cpp_concepts
, e.g. here: https://godbolt.org/z/P4z3Pj5vT
的报告值
在您的 class 模板上,您有两个析构函数定义配方。在实例化期间,编译器获得与所需签名匹配的“第一个”配方。取决于编译器取决于结果。我认为 clang、gcc 和 mingw 将提供相同的结果,msvc 方法不同。
我有这段代码,输出如下:
link到下面的例子 https://godbolt.org/z/z8Pn9GsTv
template <typename T>
struct A1 {
A1() {
std::cout << "construction of a1" << std::endl;
}
~A1() {
std::cout << "destruction of a1" << std::endl;
}
~A1() requires (std::is_same_v<T,int>) {
std::cout << "it is an int" << std::endl;
}
};
int main() {
A1 <int>a;
return 0;
}
输出:
construction of a1
destruction of a1
但是交换析构函数的位置会得到其他结果:
link 到代码 https://godbolt.org/z/vxj7dPqaj
template <typename T>
struct A1 {
A1() {
std::cout << "construction of a1" << std::endl;
}
~A1() requires (std::is_same_v<T,int>) {
std::cout << "it is an int" << std::endl;
}
~A1() {
std::cout << "destruction of a1" << std::endl;
}
};
输出:
construction of a1
it is an int
想知道这是一个错误吗?
在您的第二个代码中,
尝试改变这个:
A1 <int>a;
为此:
A1 <double>a;
你会得到输出:
construction of a1
destruction of a1 // With MSVC & GCC compiler
我在这里的解释是,当第一个构造函数(requires
)的条件失败时,将调用第二个构造函数,它打印 "destruction of a1"
并销毁 a
。
这确实是一个已报告的 Clang 错误1,如
请注意,第二个片段(第一个带有约束析构函数的片段)在 Clang 中并没有真正“工作”,它只是忽略了第二个析构函数2.
另请注意,与 gcc 不同,在我撰写本文时,Clang 似乎尚未实现 [P0848R3](这是关于条件琐碎的特殊成员函数)3.
1) https://bugs.llvm.org/show_bug.cgi?id=50570
2) 参见示例:https://godbolt.org/z/rff7qfK65
3) 查看 feature test macro __cpp_concepts
, e.g. here: https://godbolt.org/z/P4z3Pj5vT
在您的 class 模板上,您有两个析构函数定义配方。在实例化期间,编译器获得与所需签名匹配的“第一个”配方。取决于编译器取决于结果。我认为 clang、gcc 和 mingw 将提供相同的结果,msvc 方法不同。