相关疑难解决方法(0)

是否允许std :: tuple的实现失败并触发空类元素的派生到基础转换?

此代码不能使用GCC4.7进行编译

struct A {};
void f(A);

struct B { B(std::tuple<A>); };
void f(B);

int main() {
  f(std::make_tuple(A()));
}
Run Code Online (Sandbox Code Playgroud)

因为GCC派生自A利用空基类优化.然而,这导致海湾合作委员会挑选f(A)和抱怨

错误:'A'是一个无法访问的基础'tuple<A>'

这个错误是由C++标准授予的,还是仅仅是libstdc ++的错误?

c++ language-lawyer c++11 stdtuple

18
推荐指数
1
解决办法
364
查看次数

空嵌套元组错误

#include <iostream>
#include <tuple>
int main(){

auto bt=std::make_tuple(std::tuple<>(),std::tuple<std::tuple<>>()); //Line 1
auto bt2=std::make_tuple(std::tuple<>(),std::tuple<>());             //Line 2
}
Run Code Online (Sandbox Code Playgroud)

为什么第1行给出编译错误而第2行编译正常?(在Gcc和Clang中测试过)

有可能的解决方法吗?

clang的错误消息

/usr/include/c++/4.6/tuple:150:50: error: ambiguous conversion from derived class 'std::_Tuple_impl<0, std::tuple<>,
      std::tuple<std::tuple<> > >' to base class 'std::_Head_base<0, std::tuple<>, true>':
    struct std::_Tuple_impl<0, class std::tuple<>, class std::tuple<class std::tuple<> > > -> _Tuple_impl<0UL + 1, class std::tuple<class std::tuple<> > > -> _Head_base<1UL, class std::tuple<class std::tuple<> >, std::is_empty<class tuple<class tuple<> > >::value> -> class std::tuple<class std::tuple<> > -> _Tuple_impl<0, class std::tuple<> > -> _Head_base<0UL, class std::tuple<>, std::is_empty<class …
Run Code Online (Sandbox Code Playgroud)

c++ nested tuples c++11

6
推荐指数
1
解决办法
485
查看次数

公共基类打破了元组的空基类优化

gcc 4.7.1对元组进行空基类优化,我认为这是一个非常有用的功能.但是,似乎有一个意外的限制:

#include <tuple>
#include <cstdint>
#include <type_traits>
class A { };
class B : public A { std::uint32_t v_; };
class C : public A { };
static_assert(sizeof(B) == 4,                "A has 32 bits.");
static_assert(std::is_empty<C>::value,       "B is empty.");
static_assert(sizeof(std::tuple<B, C>) == 4, "C should be 32 bits.");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最后一个断言失败,因为元组实际上大于4个字节.有没有办法避免这种情况,而不打破类层次结构?或者我是否必须实现我自己的对实现,以其他方式优化这种情况?

c++ gcc libstdc++ c++11 stdtuple

3
推荐指数
1
解决办法
746
查看次数

标签 统计

c++ ×3

c++11 ×3

stdtuple ×2

gcc ×1

language-lawyer ×1

libstdc++ ×1

nested ×1

tuples ×1