更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。
这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n Array<double, 2, 2> a;\n a.setRandom();\n\n Array<double, 3, 2> b;\n b.col(0).tail(2) = a.col(1);\n // b.col(0).template tail<2>() = a.col(1);\n\n return b;\n}\n\nint main(){\n std::cout << foo() << \'\\n\';\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32。
在以下情况下不会出现该错误: …
我有一个istream并且需要将两个分隔符之间的内容复制到一个std::string. 我可以找到定界符' streampos,但是当尝试使用它istream_iterator<char>来遍历流的部分时,它不起作用。这是我尝试过的:
#include <iostream>
#include <sstream>
#include <iterator>
std::string copyToString( std::istream& is )
{
is >> std::ws;
auto someLength {10};
std::istream_iterator<char> beg {is};
is.seekg( someLength, std::ios::cur );
//std::istream_iterator<char> end { is };
std::istream_iterator<char> end { std::next(beg, someLength) };
return std::string{ beg, end };
}
int main()
{
std::stringstream ss;
ss.str( " { my string content }" );
std::cout << "\"" << copyToString( ss ) << "\"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计输出长度为 10 个字符,但它只是 …
我想使用一个函数解析器库,其中成员函数FunctionParser::Eval()是非常量的,因为它将错误代码写入成员变量。我想将此函数解析器集成到代码库中,在该代码库中,将通过包含const该函数解析器的类的成员函数调用此函数,从而违反const正确性。
此const成员函数是接口的一部分,其中constness 具有语义意义。我可以改变那个界面,所以这仍然是一个选择。作为测试,我曾经const_cast执行违反const正确性的代码,这不会导致任何错误或单元测试失败(至少不是在调试模式下)。
现在我的问题是:const在这种情况下违反正确性时,我应该期待什么问题?(这值得吗?)
我想在循环parallel外部的区域中使用 OpenMP 缩减for。根据OpenMP 参考parallel,可以在区域中使用归约子句,因此不需要for循环 or 。sections
reduction (min:...)但是,当在某个区域使用 OpenMP 时parallel,我得到的结果不正确。但是,如果我对 a 使用完全相同的结构reduction (max:...),则结果是正确的。如果我使用循环进行最小减少(#pragma omp for reduction (min:...)),结果是正确的,但我认为这没有必要。这是我的代码:
#include <omp.h>
#include <iostream>
#include <limits>
#include <algorithm>
int main(){
auto minVar { std::numeric_limits<int>::max() };
auto maxVar { std::numeric_limits<int>::min() };
auto minVarLoop { std::numeric_limits<int>::max() };
#pragma omp parallel
{
int threadNo { omp_get_thread_num() };
#pragma omp reduction (min:minVar)
minVar = std::min(minVar, threadNo);
// minVar = minVar …Run Code Online (Sandbox Code Playgroud)