我试图理解以下代码片段
片段 #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) 这是我要编译的程序。
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 ++ 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代码吗?此错误的原因是什么?
我试图了解volatile关键字在C ++中的工作方式。
我看了一下“易失性”在C ++中可以防止哪些优化?。查看可接受的答案,看起来像volatile禁用了两种优化
我在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)