相关疑难解决方法(0)

奇怪的是相互重复的类定义

我希望两个类中的类型声明相互依赖.这是第一个用clang和gcc编译的例子:

template <class Sum>
struct A
{
    using X = char;                // (1)
    using Z = typename Sum::B::Y;  // (2)
};

template <class Sum>
struct B
{
    using Y = typename Sum::A::X;
};

struct AplusB
{
    using A = ::A<AplusB>;
    using B = ::B<AplusB>;
};

AplusB::A::Z z;

int main() {}
Run Code Online (Sandbox Code Playgroud)

然而,有一个有趣的时刻.如果你交换行(1)和(2),那么它将无法编译并出现错误:

错误:'A'中没有名为'X'的类型

这让我怀疑原始代码在C++标准意义上是否真的有效,或者它恰好编译?

这是第二个例子,它也利用了模板实例化的顺序:

template <class Sum>
struct A
{
    using X = char;
    using P = typename Sum::B::Q;
};

template <class Sum>
struct B
{
    using Y = typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer template-meta-programming

21
推荐指数
1
解决办法
574
查看次数

后备可变参数构造函数 - 为什么这样做?

在回答这个问题大约要建一个可变参数转发参考构造函数,如果没有其他的构造是有效的只应被调用.也就是说,如果有:

C(const char*, size_t) { }                     // 1
template <typename... T, ???> C(T&&... ) { }   // 2
Run Code Online (Sandbox Code Playgroud)

我们想要C c1{"abc", 2};调用(1),尽管需要转换,但是C c2{1, 2, 3};要调用(2),因为(1)不能应用.

我提出了以下解决方案:

template <typename... T,
          typename = std::enable_if_t<!std::is_constructible<C, T&&...>::value>
           >
C(T&&... ) { }
Run Code Online (Sandbox Code Playgroud)

通过提议,我的意思是,我尝试了它,并惊讶地发现它确实有效.它编译并完成我在gcc和clang上所希望的.不过,我很茫然,解释为什么它的工作原理,甚至如果它实际上应该工作,gcc和铛都只是是特别适应.是吗?为什么?

c++ templates c++14

13
推荐指数
1
解决办法
363
查看次数