我一直在 std::string_view 上出现错误曲线,但我能够构建得很好。有没有办法告诉智能感知或 C++ linter 使用 C++17?
我得到的具体错误是:
namespace "std" has no member "string_view"
Run Code Online (Sandbox Code Playgroud) 我最近设置了 Fedora 33 并且正在迁移我的文件。我复制了我的 ssh 密钥,发现我无法再从 bitbucket git repos 中拉出我能够从旧笔记本电脑上拉出的。ssh密钥完全一样,公钥已经在bitbucket账户上了。此外,权限设置为chmod 600. 我仍然无法从回购中拉出。
// Reset resets the Builder to be empty.
func (b *Builder) Reset() {
b.addr = nil
b.buf = nil
}
Run Code Online (Sandbox Code Playgroud)
代码片段来自go strings.Builder中的源代码。缓冲区设置nil为而不是b.buf[:0]。nil将其设置为而不保留容量的原因是什么?
编辑:
我可以看到它Reset()可以用于 GC 底层缓冲区并允许重新使用 Builder 结构,但初始化该结构似乎是边际成本,因为它只是两个指针,而底层数组可能是更大,并且可以重复使用。我觉得应该有一个Clear()函数可以保留底层缓冲区的容量,但将其长度减少到 0,而且实现起来很简单。这让我相信没有这样做是有原因的,我很好奇这个原因是什么。
#include <iostream>
#include <stdint.h>
class Test {
public:
Test(const int64_t & val) : val_(val) {
std::cout << "initialized: " << val_ << std::endl;
}
void print() {std::cout << "reference val: " << val_ << std::endl;}
private:
const int64_t & val_;
};
int main() {
long long int input_val= 1628020800000000000L;
auto t = Test(input_val);
std::cout << "input_val: " << input_val << std::endl;
t.print();
}
Run Code Online (Sandbox Code Playgroud)
如果您在没有优化构建的情况下构建,则会得到以下结果:
g++ main.cpp -std=c++17
initialized: 1628020800000000000
input_val: 1628020800000000000
reference val: 1628020800000000000
Run Code Online (Sandbox Code Playgroud)
如果您使用优化构建(例如 -O3)构建,您将获得以下信息:
g++ main.cpp -std=c++17 -O3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试定义我自己的散列函数,std::unordered_map并且我想散列一个结构中的一个字段,该字段应该是键。下面的代码是我所拥有的简化版本:
struct TestStruct {
char a[64];
char b[64];
}
struct my_eq {
bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
}
};
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>(std::string_view(test.a));
}
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)
Run Code Online (Sandbox Code Playgroud)
根据cppreference上std::hash的hash函数应该支持std::string_view. 我觉得我错过了一些简单的东西,但我无法弄清楚。
我知道这std::hash<T>是依赖于实现的,但它们应该是确定性的吗?
我知道如果我std::hash<T>在同一个进程中多次运行函数多次,我会得到相同的输出.但是,如果我重新启动该过程,我会获得相同的值吗?是否有用于std :: hash的种子?它取决于编译器版本还是其他因素?
是否可以保证输入时无论过程运行何时启动,机器还是编译器版本,X我都会得到输出Y?