gpt4 book ai didi

c++ - propagate_const 和前向声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:38 26 4
gpt4 key购买 nike

我刚刚遇到了奇怪的 std::experimental::propagate_const 错误。以下片段演示了问题

#include <memory>
#include <experimental/propagate_const>
#include <map>

class FWD;

//compiles
class A
{
std::unique_ptr<FWD> m;
};

//compiles
class B
{
std::experimental::propagate_const<std::unique_ptr<FWD>> m;
};

//compiles
class C
{
std::unique_ptr<std::map<int, FWD>> m;
};

//does not compile!
class D
{
std::experimental::propagate_const<std::unique_ptr<std::map<int, FWD>>> m;
};

所以您不能只用传播的 unique_ptr 替换 unique_ptr,因为有时您的前向声明会破坏它。

如果有人能向我解释为什么在当前的 propagate_const 实现中编译失败,我将不胜感激。有关系

typedef remove_reference_t<decltype(*std::declval<_Tp&>())> element_type;

因为解决方法是:

template <typename T, typename = void>
struct get_element_type
{
using type = std::remove_reference_t<decltype(*std::declval<T&>())>;
};

template <typename T>
struct get_element_type<T, typename std::enable_if<!std::is_void<typename T::element_type>::value>::type>
{
using type = typename T::element_type;
};

// Namespaces and class declaration...

using element_type = typename get_element_type<T>::type;

经过测试的编译器:clang、gcc。

附言我想知道编译器开发人员是否知道它。

最佳答案

  1. 通常禁止实例化具有不完整类型的标准库模板。

  2. std::map该规则也不异常(exception)。

  3. 查询decltype(*std::declval<_Tp&>())_Tp = std::unique_ptr<std::map<int, FWD>>需要实例化 _Tp 的所有关联类寻找潜在的 friend operator*声明。

  4. 在这些关联类中有 std::map<int, FWD> .

  5. 实例化 std::map<int, FWD>调用未定义的行为。

关于c++ - propagate_const 和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54787606/

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