我遇到了下面的代码,但需要一些帮助来理解代码.假设字符串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语句中跟随字符串的花括号是什么?
const char * foo()
{
return "abcdef";
}
int main()
{
printf("%s", foo());
}
Run Code Online (Sandbox Code Playgroud)
符合标准的编译器是否可以决定"abcdef"在堆栈上进行分配?即标准中的内容强制编译器在该.data部分中分配它?
本来我喜欢用这样的东西:
(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++中,迭代器是"事物",你可以在其上至少编写解引用运算符*it,增量运算符++it,对于更高级的双向迭代器,减量--it,最后但并非最不重要的是,对于随机访问迭代器,我们需要运算符索引it[]和可能的加法和减法.
C++中的这类"东西"是具有相应运算符重载的类型的对象,或简单和简单的指针.
std::vector<>是一个包装连续数组的容器类,因此指针作为迭代器是有意义的.在网上,在一些文献中你可以找到vector.begin()用作指针.
使用指针的基本原理是开销更少,性能更高,特别是如果优化编译器检测到迭代并执行其操作(向量指令和内容).使用迭代器可能更难以使编译器进行优化.
知道这一点,我的问题是为什么现代STL实现,比如Mingw 4.7中的MSVC++ 2013或libstdc ++,为矢量迭代器使用了一个特殊的类?
我按照以下方式编写了一个函数:
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.如果我省略&声明中的' ',这将无效.(或者更确切地说,它只能在函数本地工作,但不会改变调用者中的任何内容)
有人可以向我解释这*&实际上是做什么的吗?它看起来很奇怪,我只是无法理解它.
这里到底发生了什么?为什么这是一个错误?
void f(int &&);
int && i = 5;
f(i);
Run Code Online (Sandbox Code Playgroud)
这不是有点违反直觉吗?
我希望i是一个右值引用,所以能够传递给它f().但我得到一个错误;
没有任何已知的转化率从
int至int &&
所以我猜i在申报后不是左值参考?
枚举类型的声明有什么意义?它是在枚举名称后面吗?我看过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位置在标识符之后并且必须是可见的.
我是否应该包括每个标题,即使之前包括它?或者我可以尽可能地避免它?例如.如果我使用std::string和std::vector在某些文件中.如果<string>包含<vector>我应该只包括<string>或<string>和<vector>?
我正在构建一个lambda函数,需要在上下文中访问相当数量的变量.
const double defaultAmount = [&]{
/*ToDo*/
}();
Run Code Online (Sandbox Code Playgroud)
我宁愿不在[=]列表中使用,因为我不想要制作很多有价值的副本.
如果我使用,我担心程序稳定性,[&]因为我不希望lambda修改捕获集.
我可以通过const引用吗?[const &]不起作用.
也许一个好的编译器可以优化值副本,因此[=]更可取.
这是一些有效的语法:
std::uniform_real_distribution<> randomizer(0, 100);
Run Code Online (Sandbox Code Playgroud)
它是如何工作的,是否自动推导出对象模板?为什么有必要<>在类型的末尾写?我可以不删除它<>,它会是一样的吗?