小编bam*_*bam的帖子

访问嵌套结构而不移动

我有这些结构:

#[derive(Debug, RustcDecodable)]
struct Config {
    ssl: Option<SslConfig>,
}

#[derive(Debug, RustcDecodable)]
struct SslConfig {
    key: Option<String>,
    cert: Option<String>,
}
Run Code Online (Sandbox Code Playgroud)

它们从toml文件中填充.这完全没问题.因为我得到了Option<T>它,我要么打电话unwrap()要么做match.

但如果我想做以下事情:

let cfg: Config = read_config(); // Reads a File, parses it and returns the Config-Struct
let keypath = cfg.ssl.unwrap().key.unwrap();
let certpath = cfg.ssl.unwrap().cert.unwrap();
Run Code Online (Sandbox Code Playgroud)

它将无法工作,因为cfg.ssl被移动到keypath.但它为什么会被感动?我叫unwrap()ssl拿到钥匙(和unwrap()它).那么结果key.unwrap()应该被移动?

还是我错过了一点?什么是使这些结构可以像这样(或以其他整洁的方式)访问的最佳方法?我试图实现#[derive(Debug, RustcDecodable, Copy, Clone)],但是这是行不通的,因为我要实现CopyString为好.然后,我要实现CopyVec<u8>等.必须有一个更方便的解决方案?

nested rust

5
推荐指数
2
解决办法
742
查看次数

关于向量记忆行为的问题

我最近对内存(de)分配感到困惑 std::vectors

让我们假设我得到了整数的正常向量: std::vector<int> intv;当我push_back有时int它会随着时间而增长.当我离开函数的范围(即)时,它会被释放,而不需要额外的调用.

大.让我们举另一个例子:

struct foo_t{
    std::string bar:
    unsigned int derp;
}
void hurr(){
    std::vector<foo_t> foov;
    foo_t foo;
    foo.bar = "Sup?";
    foo.derp = 1337;
    foov.push_back(foo);
}
Run Code Online (Sandbox Code Playgroud)

好的.当我调用hurr()vector创建时,会创建一个foo_t实例,实例将被填充并推送到向量.因此,当我离开函数时,向量将被释放,内容(此处为一个foo_t)也会被释放?

下一个例子:

struct foo_t{
    std::string bar:
    unsigned int derp;
}
std::vector<foo_t> hurr(){
    std::vector<foo_t> foov;
    foo_t foo;
    foo.bar = "Sup?";
    foo.derp = 1337;
    foov.push_back(foo);
    return foov;
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,向量及其内容存在于堆栈中,它最终被时间覆盖并且我返回的向量和其内容将是无用的.或者它实际上是否返回了带有其内容副本的向量副本(如果它不是POD,则需要内容数据类型的Copy-Constructor)?

显而易见的事情:

struct foo_t{
    std::string bar:
    unsigned int derp;
}
std::vector<foo_t*> hurr(){
    std::vector<foo_t*> foov;
    foo_t …
Run Code Online (Sandbox Code Playgroud)

c++ stl stdvector c++11

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

C++ 枚举类:转换为不存在的条目

我在一个项目中遇到了这种情况,其中我们有一些套接字通信,主要为流量控制交换字符。我们将这些字符转换为enum class : char一个开关。我想知道,如果另一端发送的字符不在我们的枚举类中,会发生什么。

我有这个 mwe:

enum class Foo : char {
    UNKNOWN,
    ENUM1 = 'A',
    ENUM2 = 'B',
    ENUM3 = 'C'
};

char bar1() {
    return 'B';
}

char bar2() {
    return 'D';
}

int main() {
    switch((Foo)bar1()) {
        case Foo::UNKNOWN:std::cout << "UNKNWON" << std::endl;break;
        case Foo::ENUM1:std::cout << "ENUM1" << std::endl;break;
        case Foo::ENUM2:std::cout << "ENUM2" << std::endl;break;
        case Foo::ENUM3:std::cout << "ENUM3" << std::endl;break;
        default:std::cout << "DEFAULT" << std::endl;break;
    }
    switch((Foo)bar2()) {
        case Foo::UNKNOWN:std::cout << "UNKNWON" << std::endl;break; …
Run Code Online (Sandbox Code Playgroud)

c++ enums undefined-behavior enum-class

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

标签 统计

c++ ×2

c++11 ×1

enum-class ×1

enums ×1

nested ×1

rust ×1

stdvector ×1

stl ×1

undefined-behavior ×1