gpt4 book ai didi

c++ - 引用强制模板实例化的静态转换,其中不完整的类型很好

转载 作者:可可西里 更新时间:2023-11-01 16:47:10 26 4
gpt4 key购买 nike

以下代码无法在 gcc 7.3.0 和 clang 6.0.0 上编译(但似乎在 MSVC 下编译正常):

#include <utility>

struct IncompleteType;

template<typename T>
struct Container {
T value;
};

using Uninstantiatable = Container<IncompleteType>;

auto foo() -> decltype(static_cast<Uninstantiatable const&>(std::declval<Uninstantiatable const&>())) {
throw 1;
}

我得到的错误是这样的:

<source>:7:7: error: field has incomplete type 'IncompleteType'
T value;
^
<source>:12:24: note: in instantiation of template class 'Container<IncompleteType>' requested here
auto foo() -> decltype(static_cast<Uninstantiatable const&>(std::declval<Uninstantiatable const&>())) {
^
<source>:3:8: note: forward declaration of 'IncompleteType'
struct IncompleteType;
^
1 error generated.
Compiler returned: 1

在这里自己试试:https://godbolt.org/g/5AW37K

但是,如果我将第 10 行替换为

,它会编译
using Uninstantiatable = IncompleteType;

就像@Jarod42 提到的,如果您删除 Container 的定义,它会再次编译:http://godbolt.org/g/ue9iwC看起来 gcc 和 clang 因此只在定义模板类时实例化它。

在这两种情况下,我只是试图将一个 const-ref 复制到一个 const-ref,所以我希望无论类型是什么都能正常工作,如果类型本身不完整,这确实有效。标准是否指定在此处触发模板实例化,或者 gcc 和 clang 的行为不正确?

请注意,上面代码中的模式取自 gcc 的 std::is_constructible 实现,当我试图复制一个包含不完整类型参数的模板类的 const ref 的元组时,错误被触发,所以是的,这在实践中发生了。

最佳答案

根据标准隐式类模板实例化只应在需要完整对象时执行[temp.inst]/1 :

[...], the class template specialization is implicitly instantiated when the specialization is referenced in a context that requires a completely-defined object type or when the completeness of the class type affects the semantics of the program.

正如 Jarod 的评论中所指出的,如果未提供 container 的定义,Unintatiable 是独立于 InCompleteType 的完整性的不完整类型,代码编译.此外,此 static_cast 显然与对象的完整性无关。所以我认为这是 gcc 和 clang 的编译器错误。

关于c++ - 引用强制模板实例化的静态转换,其中不完整的类型很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51245880/

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