小编Mut*_*ect的帖子

试图理解模板和名称查找

我试图理解以下代码片段

片段 #1

template <typename T>
struct A
{
    static constexpr int VB = T::VD;
};

struct B : A<B>
{
};
Run Code Online (Sandbox Code Playgroud)

gcc9 和 clang9 都不会在这里抛出错误。

问:为什么这段代码会编译?A<B>从 B 继承时我们不是实例化了吗?B中没有VD,所以编译器不应该在这里抛出错误吗?

片段 #2

template <typename T>
struct A
{
    static constexpr auto AB = T::AD; // <- No member named AD in B
};

struct B : A<B>
{
    static constexpr auto AD = 0xD;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,gcc9 编译得很好,但 clang9 抛出一个错误,说“B 中没有名为 AD 的成员”。

Q. 为什么用gcc9编译/为什么不用clang9编译?

片段 #3

template <typename T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer

8
推荐指数
1
解决办法
196
查看次数

尝试解决GCC特定的编译错误

这是我要编译的程序。

template <typename T>
struct A
{
    T foo() const
    {
        return 1;
    }
};

template <typename T>
struct B : A<T>
{
    using U = A<T>;
    T foo() const
    {
        return 2;
    }
};

template <typename T>
struct D
{
    B<T> b;
    int foo() const
    {
        // using U = typename B<T>::U; // compilation succeeds if I uncomment this line
        return b.U::foo();
    }
};

int main()
{
    D<int> d;
    return d.foo();
}
Run Code Online (Sandbox Code Playgroud)

我在gcc 9.2,clang 9.0.0和icc19.0.1中看到了不同的行为。该程序无法使用gcc编译并给出错误U has not been …

c++

5
推荐指数
1
解决办法
101
查看次数

无法编译简单的C ++ 17程序

我正在尝试使用C ++ 17 if constexpr功能,但是无法编译一个简单的功能。

码:

template <auto B>
int foo()
{
    if constexpr(B)
    {
        return 1;
    }
    else
    {
        return 2;
    }
}  // <- I get an error here 

int main()
{
    return foo<false>();
}
Run Code Online (Sandbox Code Playgroud)

编译器输出的错误:

<source>(12): error #1011: missing return statement at end of non-void function "foo<B>() [with B=false]"

  }
Run Code Online (Sandbox Code Playgroud)

使用的-std=c++17 -O3 -Wall -Werror编译器标志和icc 19.0.1编译器。

这是有效的C ++ 17代码吗?此错误的原因是什么?

c++ c++17

5
推荐指数
1
解决办法
75
查看次数

了解C ++中的volatile关键字

我试图了解volatile关键字在C ++中的工作方式。

我看了一下“易失性”在C ++中可以防止哪些优化?。查看可接受的答案,看起来像volatile禁用了两种优化

  1. 防止编译器将值缓存在寄存器中。
  2. 在您的程序的POV中似乎不必要的时候,优化对该值的访问。

我在https://en.cppreference.com/w/cpp/language/as_if找到了类似的信息。

对易失性对象的访问(读取和写入)严格按照发生它们的表达式的语义来发生。特别是,它们不会相对于同一线程上的其他易失性访问而重新排序。

我编写了一个简单的C ++程序,该程序对数组中的所有值求和,以比较Plain ints和volatile int的行为。请注意,部分和不会不稳定。

数组由不合格的ints 组成。

int foo(const std::array<int, 4>& input)
{
    auto sum = 0xD;
    for (auto element : input)
    {
        sum += element;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

阵列由挥发性的int小号

int bar(const std::array<volatile int, 4>& input)
{
    auto sum = 0xD;
    for (auto element : input)
    {
        sum += element;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

当我查看生成的汇编代码时,仅在纯ints的情况下使用SSE寄存器。据我所知,使用SSE寄存器的代码既没有优化读取,也没有对读取进行重新排序。循环已展开,因此也没有分支。我能解释代码源为何不同的唯一原因是:在发生累积之前,可以对易失性读进行重新排序吗?显然,sum它不是挥发性的。如果这种重新排序不好,是否存在可以说明问题的情况/示例?

使用clang9生成的代码

foo(std::array<int, 4ul> …
Run Code Online (Sandbox Code Playgroud)

c++

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

标签 统计

c++ ×4

c++17 ×1

language-lawyer ×1

templates ×1