Scott Meyers的书第18项有效STL:50改进您对标准模板库的使用的具体方法说避免vector <bool>
因为它不是STL容器而且它实际上并不存在bool.
以下代码:
vector <bool> v;
bool *pb =&v[0];
Run Code Online (Sandbox Code Playgroud)
不会编译,违反STL容器的要求.
错误:
cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization
Run Code Online (Sandbox Code Playgroud)
bool
返回类型应该是T&,但为什么它是特殊情况vector<T>::operator []
?
什么是T&
真正组成的呢?
该项目进一步说:
deque<bool> v; // is a STL container and it really contains bools
Run Code Online (Sandbox Code Playgroud)
这可以用作替代品vector<bool>
吗?
有人可以解释一下吗?
以下递归lambda调用如何结束/终止?
#include <cstdio>
auto terminal = [](auto term) // <---------+
{ // |
return [=] (auto func) // | ???
{ // |
return terminal(func(term)); // >---------+
};
};
auto main() -> int
{
auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我不明白为什么下面的代码编译?
int main()
{
//int a = nullptr; // Doesn't Compile
//char b = nullptr; // Doesn't Compile
bool c = nullptr; // Compiles
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而评论部分没有.
这两个bool
和nullptr
是关键字,那么什么是关于其他数据类型的独特之处?
我不熟悉K&R风格的功能声明.
编译之后,带有警告(仅与main的返回值相关-Wall
)但是使用的变量的数据类型是什么?
main(a, b, c, d){
printf("%d", d);
}
foo(a, b){
a = 2;
b = 'z';
}
Run Code Online (Sandbox Code Playgroud)
如果这是一个问题,请在评论部分提供链接.我找不到类似的东西.
编辑
我刚刚遇到了一个混淆的C代码,它使用了这些代码.
但我可以向你保证,我不会在C编程中使用这样的语法.
在阅读有关C++和标准库的书籍时,我看到频繁引用分配器.
例如,Nicolai Josuttis的C++标准库在最后一章中详细讨论了它们,并且第2项("了解分配器的约定和限制")和11("理解自定义分配器的合法用途")在Scott Meyers的有效的STL是关于它们的使用.
我的问题是,分配器如何代表一个特殊的内存模型?默认的STL内存管理不够吗?何时应该使用分配器?
如果可能,请使用简单的内存模型示例进行说明.
以下代码的正确行为是什么?
#include <vector>
#include <iostream>
int main()
{
std::vector<char> v = { "y", "z" };
std::cout << v[0];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不是一个未定义的行为吗?
以下代码不编译 g ++ 4.8.1
struct Layers
{
typedef struct Widgets { } Widgets;
virtual void fun(void)
{
struct Widgets w;
}
Widgets w, x, y, z ;
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是使用Widgets w, x, y ; //Remove variable z
它编译!
为什么会这样?我在这里错过了什么?
我是C语言的新手,所以我的问题可能达不到高标准
我们可以使用吗
struct mat{
int a[10];
};m[10];
Run Code Online (Sandbox Code Playgroud)
代替
int mat[10][10];
Run Code Online (Sandbox Code Playgroud)
有什么不同?哪个更有效率?
说一堂课
class Piece {} ;
如果我是对的,应该相当于:
class Piece {
//C++ 03
Piece (); //default constructor
Piece( const Piece&); //copy constructor
Piece& operator=(const Piece&); //copy assignment operator
~Piece(); //destructor
//Since C++ 11
Piece(Piece&&); //move constructor
Piece& operator=(Piece&&); //move assignment operator
};
Run Code Online (Sandbox Code Playgroud)
那么我能说些什么呢?
一个)
class Pawn{
~Pawn() {}// Only destructor
};
Run Code Online (Sandbox Code Playgroud)
b)
class Bishop{
Bishop(Bishop&& ) {}// Only move constructor
};
Run Code Online (Sandbox Code Playgroud)
C)
class Knight{
Knight(Knight&&, int =0) {} // move constructor, when no second arg present
};
Run Code Online (Sandbox Code Playgroud)
d)
class Rook {
Rook(const …
Run Code Online (Sandbox Code Playgroud) 以下代码编译:
auto foo(int i) {
if( i == 1 )
return i;
else
return foo(i-1)+i ;
}
Run Code Online (Sandbox Code Playgroud)
auto foo(int i) {
return (i == 1) ? i : foo(i-1)+i ;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能在第二种情况下推断出返回类型?我在这里错过了一些东西吗?
我知道(i == 1)
在第二种情况下有一个序列点,但这不应该影响编译,对吧?