【发布时间】:2020-03-15 04:19:41
【问题描述】:
以下示例取自cppreference:
#include <iostream>
#include <memory>
#include <experimental/propagate_const>
struct X
{
void g() const { std::cout << "g (const)\n"; }
void g() { std::cout << "g (non-const)\n"; }
};
struct Y
{
Y() : m_ptrX(std::make_unique<X>()) { }
void f() const
{
std::cout << "f (const)\n";
m_ptrX->g();
}
void f()
{
std::cout << "f (non-const)\n";
m_ptrX->g();
}
std::experimental::propagate_const<std::unique_ptr<X>> m_ptrX;
};
int main()
{
Y y;
y.f();
const Y cy;
cy.f();
}
我想进一步确保指针(m_ptrX)地址不可修改,所以我将声明改为
std::experimental::propagate_const<const std::unique_ptr<X>> m_ptrX;
但是不行,gcc 9报如下错误(详见here)
g++ -std=c++2a -pthread -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc++fs && ./a.out
In file included from main.cpp:3:
/usr/local/include/c++/9.2.0/experimental/propagate_const: In instantiation of 'constexpr std::experimental::fundamentals_v2::propagate_const<_Tp>::element_type* std::experimental::fundamentals_v2::propagate_const<_Tp>::get() [with _Tp = const std::unique_ptr<X>; std::experimental::fundamentals_v2::propagate_const<_Tp>::element_type = X]':
/usr/local/include/c++/9.2.0/experimental/propagate_const:205:13: required from 'constexpr std::experimental::fundamentals_v2::propagate_const<_Tp>::element_type* std::experimental::fundamentals_v2::propagate_const<_Tp>::operator->() [with _Tp = const std::unique_ptr<X>; std::experimental::fundamentals_v2::propagate_const<_Tp>::element_type = X]'
main.cpp:24:15: required from here
/usr/local/include/c++/9.2.0/experimental/propagate_const:225:25: error: invalid conversion from 'const element_type*' {aka 'const X*'} to 'std::experimental::fundamentals_v2::propagate_const<const std::unique_ptr<X> >::element_type*' {aka 'X*'} [-fpermissive]
225 | return __to_raw_pointer(_M_t);
| ~~~~~~~~~~~~~~~~^~~~~~
| |
| const element_type* {aka const X*}
那么实现效果的正确方法是什么,假设我不想实现immutable_unique_ptr这样的模板。
【问题讨论】:
-
这个
propagate_const看起来像另一个样板,你可能想要坚持你班级中的几乎每个成员指针。有它的道理,说得通,但是它让代码越来越长…… -
它可以使用 GCC 9.2 C++14 及更高版本在我的系统上轻松编译。可能是系统特定的吗?另请参阅:wandbox.org/permlink/nL9huBh5yJVc11Ks
-
@AniketChowdhury 问题是为什么当
std::experimental::propagate_const<std::unique_ptr<X>> m_ptrX;被std::experimental::propagate_const<const std::unique_ptr<X>> m_ptrX;替换时它不起作用。
标签: c++ c++11 c++17 unique-ptr