小编Nia*_*all的帖子

解释字符串修剪功能

我遇到了下面的代码,但需要一些帮助来理解代码.假设字符串s在任一侧都有空格.

string trim(string const& s){
   auto front = find_if_not(begin(s), end(s), isspace);
   auto back = find_if_not(rbegin(s), rend(s), isspace);
   return string { front, back.base() };
}
Run Code Online (Sandbox Code Playgroud)

作者说,后面指向最后一个空格的末尾,而前面指向第一个非空白字符.所以back.base()被调用但我不明白为什么.

另外,在return语句中跟随字符串的花括号是什么?

c++ string c++11 c++14

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

可以在堆栈上分配const静态字符串吗?

const char * foo()
{
    return "abcdef";
}

int main()
{
    printf("%s", foo());
}
Run Code Online (Sandbox Code Playgroud)

符合标准的编译器是否可以决定"abcdef"在堆栈上进行分配?即标准中的内容强制编译器在该.data部分中分配它?

c c++ memory

21
推荐指数
3
解决办法
2201
查看次数

为什么可以(false?A():B()).test()仅在A和B具有子类关系时编译?

本来我喜欢用这样的东西:

(true?a:b).test()
Run Code Online (Sandbox Code Playgroud)

代替

(true?a.test():b.test())
Run Code Online (Sandbox Code Playgroud)

如果函数具有相同的名称,为了节省打字时间,最初我认为它应该是有效的,但我发现:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无法编译,但如果B是子类A:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B : public A{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译,为什么?

c++ syntax inheritance ternary-operator

21
推荐指数
2
解决办法
1712
查看次数

C++ std :: vector <> :: iterator不是指针,为什么?

只需一点介绍,简单的单词.在C++中,迭代器是"事物",你可以在其上至少编写解引用运算符*it,增量运算符++it,对于更高级的双向迭代器,减量--it,最后但并非最不重要的是,对于随机访问迭代器,我们需要运算符索引it[]和可能的加法和减法.

C++中的这类"东西"是具有相应运算符重载的类型的对象,或简单和简单的指针.

std::vector<>是一个包装连续数组的容器类,因此指针作为迭代器是有意义的.在网上,在一些文献中你可以找到vector.begin()用作指针.

使用指针的基本原理是开销更少,性能更高,特别是如果优化编译器检测到迭代并执行其操作(向量指令和内容).使用迭代器可能更难以使编译器进行优化.

知道这一点,我的问题是为什么现代STL实现,比如Mingw 4.7中的MSVC++ 2013或libstdc ++,为矢量迭代器使用了一个特殊的类?

c++ iterator vector stdvector

21
推荐指数
3
解决办法
3348
查看次数

函数声明中的"*&"是什么意思?

我按照以下方式编写了一个函数:

void myFunc(myStruct *&out) {
    out = new myStruct;
    out->field1 = 1;
    out->field2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

现在在一个调用函数中,我可能会写这样的东西:

myStruct *data;
myFunc(data);
Run Code Online (Sandbox Code Playgroud)

这将填补所有领域data.如果我省略&声明中的' ',这将无效.(或者更确切地说,它只能在函数本地工作,但不会改变调用者中的任何内容)

有人可以向我解释这*&实际上是做什么的吗?它看起来很奇怪,我只是无法理解它.

c++ pointers reference

20
推荐指数
4
解决办法
5万
查看次数

将int &&传递给f(int &&)

这里到底发生了什么?为什么这是一个错误?

void f(int &&);

int && i = 5;

f(i);
Run Code Online (Sandbox Code Playgroud)

这不是有点违反直觉吗?

我希望i是一个右值引用,所以能够传递给它f().但我得到一个错误;

没有任何已知的转化率从int至int &&

所以我猜i在申报后不是左值参考?

c++ c++11

20
推荐指数
3
解决办法
1653
查看次数

枚举的声明点

枚举类型的声明有什么意义?它是在枚举名称后面吗?我看过Standard C++ 14(n4296)§3.3.2/ 3:

枚举的声明点紧跟在enum-specifier(7.2)或其第一个opaque-enum-declaration(7.2)中的标识符(如果有)之后,以先到者为准

但是当我试图重现它时;

template <class T>
struct CL
{
    using UndType = int;
};

enum class E: CL<E>::UndType;  //error: E is undefined
Run Code Online (Sandbox Code Playgroud)

我在所有编译器上都有一个错误,虽然枚举的枚举E位置在标识符之后并且必须是可见的.

c++ enums declaration c++11 c++14

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

我应该包括每个标题吗?

我是否应该包括每个标题,即使之前包括它?或者我可以尽可能地避免它?例如.如果我使用std::string和std::vector在某些文件中.如果<string>包含<vector>我应该只包括<string>或<string>和<vector>?

c++ c++11

17
推荐指数
2
解决办法
1629
查看次数

通过lambda捕获列表中的常量引用传递

我正在构建一个lambda函数,需要在上下文中访问相当数量的变量.

const double defaultAmount = [&]{
    /*ToDo*/
}();
Run Code Online (Sandbox Code Playgroud)

我宁愿不在[=]列表中使用,因为我不想要制作很多有价值的副本.

如果我使用,我担心程序稳定性,[&]因为我不希望lambda修改捕获集.

我可以通过const引用吗?[const &]不起作用.

也许一个好的编译器可以优化值副本,因此[=]更可取.

c++ lambda c++11

17
推荐指数
2
解决办法
1万
查看次数

创建对象时,什么是空模板参数<>?

这是一些有效的语法:

std::uniform_real_distribution<> randomizer(0, 100);
Run Code Online (Sandbox Code Playgroud)

它是如何工作的,是否自动推导出对象模板?为什么有必要<>在类型的末尾写?我可以不删除它<>,它会是一样的吗?

c++ templates c++11

17
推荐指数
2
解决办法
3465
查看次数