小编kwa*_*nti的帖子

是否允许标准库实现具有与C++标准不同的类定义?

以下代码使用clang和MSVC成功编译但无法在GCC 6.1.0中编译.

#include <memory>

template<typename R, typename T, typename... Args>
T* test(R(T::*)(Args...) const)
{
    return nullptr;
}

int main()
{
    using T = std::shared_ptr<int>;
    T* p = test(&T::get);
}
Run Code Online (Sandbox Code Playgroud)

以下错误消息

prog.cc: In function 'int main()':
prog.cc:13:16: error: invalid conversion from 'std::__shared_ptr<int, (__gnu_cxx::_Lock_policy)2u>*' to 'T* {aka std::shared_ptr<int>*}' [-fpermissive]
     T* p = test(&T::get);
            ~~~~^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

问题是libstdc ++是std::shared_ptr通过get从基类继承成员函数实现的std::__shared_ptr.

在C++标准20.8.2.2类模板shared_ptr中,它指定了std :: shared_ptr类的类定义以及该类的所有成员函数.

我的问题是,实现是否必须至少提供标准类中标准中定义的所有公共类成员?是否允许通过继承libstdc ++中实现的基类来提供成员函数?

c++ c++-standard-library language-lawyer

12
推荐指数
1
解决办法
261
查看次数

是constexpr从中间派生类引用访问基类成员吗?

struct root
{
    int i = 0;
};

struct base: root{};
struct derive: base{};

constexpr derive d0;

int main()
{
    constexpr auto& r = static_cast<root const&>(d0);
    constexpr auto& b = static_cast<base const&>(r);
    constexpr auto& d = static_cast<derive const&>(r);

    static_assert(d0.i == 0, ""); // ok
    static_assert(r.i == 0, "");  // ok
    static_assert(b.i == 0, "");  // error in gcc
    static_assert(d.i == 0, "");  // ok
}
Run Code Online (Sandbox Code Playgroud)

Clang接受上面的代码,但是gcc 7.2.0编译错误如下:

prog.cc:17:5: error: non-constant condition for static assertion
     static_assert(b.i == 0, "");
     ^~~~~~~~~~~~~ 
prog.cc:17:5: …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr

7
推荐指数
1
解决办法
215
查看次数