我知道之间的区别的auto,auto&,const auto和const auto&(例如在"每个"循环),但有一两件事令我惊讶的是:
std::string bla;
const std::string& cf()
{
return bla;
}
int main (int argc, char *argv[])
{
auto s1=cf();
const std::string& s2=cf();
s1+="XXX"; // not an error
s2+="YYY"; //error as expected
}
Run Code Online (Sandbox Code Playgroud)
那么有人可以告诉我何时x表达式auto x = fun();中的类型与返回值的类型不是同一类型fun()?
由于大多数人都喜欢谜题,我会用一个(拼写错误:)开始这个问题.想得到介绍,请注意,如果你不关心它,你可以跳过热身(JG问题)并阅读G问题,因为那是我的"真正的问题".
在审查潜在新员工提供的代码示例时,您偶然发现了一个链接列表,其实现使用了现代C++ 11特性,即std :: unique_ptr <>.
template <typename T>
struct Node {
T data;
std::unique_ptr<Node<T>> next;
Node () {}
Node(const T& data_): data(data_) {}
Node(Node& other) { std::static_assert(false,"OH NOES"); }
Node& operator= (const Node& other) {
std::static_assert(false,"OH NOES");
return *new Node();
}
public:
void addNext(const T& t) {
next.reset(new Node<T>(t));
}
};
template<typename T>
class FwdList
{
std::unique_ptr<Node<T>> head;
public:
void add(const T& t)
{
if (head == nullptr)
head.reset( new Node<T>(t));
else {
Node<T>* curr_node = head.get(); …Run Code Online (Sandbox Code Playgroud) 作为VS 2010 SP1的C++用户我经常因为编译速度慢(在QC机器上)和臭名昭着的"等待内部操作......"很长时间(有时很长时间也称为无限:()冻结而烦恼:)
所以我想知道:
编辑:我更喜欢真实数据1)而不是"感觉好多了"或"看起来一样"......
介绍(来自 Eric Lippert 博客):
令人烦恼的异常是不幸的设计决策的结果。恼人的异常是在完全非异常的情况下抛出的,因此必须一直被捕获和处理。
令人烦恼的异常的经典示例是 Int32.Parse,如果给它一个无法解析为整数的字符串,它就会抛出异常。但是此方法的 99% 用例是转换用户输入的字符串,这可能是任何旧事物,因此解析失败绝不是例外。更糟糕的是,如果不自己实现整个方法,调用者就无法提前确定他们的参数是否错误,在这种情况下,他们不需要首先调用它。
现在重要的部分:
这个不幸的设计决定非常令人烦恼,因此框架团队当然在此后不久实施了 TryParse,它做了正确的事情。
来自 MSDN Int32.TryParse:
返回值 类型:System.Boolean 如果 s 转换成功,则为 true;否则为假。
所以同事最近正在研究一些需要检查字符串是否是数字的小代码,所以在考虑之后并意识到没有好的 C++ 解决方案(基本上它是一个 for__each/find_if 或 boost:lexical_cast try catch)我想拥有is_convertible或来自 boost 的东西会有多好?
Ofc 我可以包装 boostlexical_cast并在 try 块的末尾返回 true 并在 catch 块的末尾返回 false 但我更喜欢现有的做法:) 解决方案。
在玩和尝试计算向量的总大小时,我尝试了类似的东西
vector<double> vd;
auto area = vd.size()* sizeof (vd::value_type);
//Ive seen Stepanov use area as name for this kind of size, idk if he adds the sizeof vd also to area :)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用......我需要使用,vector<double>::value_type但这会使代码的可读性降低.可以使它工作吗?我不喜欢sizeof vd.front()因为它写起来看起来很难看front().
编辑:decltype变体也适合我称之为丑陋的类别...
经常我会遇到类似的代码
/*initializer list of some class*/:m_member(some_param,/* --> */ *this)
Run Code Online (Sandbox Code Playgroud)
这样做的原因是m_member可以从包含它的类中调用成员函数... aka
//code in class that is m_member instance of
m_parent->some_function();
Run Code Online (Sandbox Code Playgroud)
我个人不喜欢它,因为我认为它是可怜的设计("亲爱的孩子,你知道你在做什么对你的课程封装"),但我想知道一般这种行为不好,如果是这样,如何避免这种设计.
编辑:请不要把重点放在initalizer列表中,让我们说它是在ctor体内.
经常在我看到的标题中
//global namespace, not in class
static const int my_global =1984;
Run Code Online (Sandbox Code Playgroud)
但最近我了解到const意味着内部联系,所以我想知道不会使静态不必要吗?
当声明模板参数是typename/ class必要的时(因为语言无法使用我在下面建议的diff语法).我知道模板参数可以是整数,所以你必须选择默认为int或typename/ class但仍然.
即为什么不呢
template <T>
T max(T a, T b) {
return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
代替
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
和
template<T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
Run Code Online (Sandbox Code Playgroud)
代替
template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
Run Code Online (Sandbox Code Playgroud) 如何实现泛型(也适用于多图,有序矢量......)等范围迭代器?我的意思是它是一个迭代器,它是一对迭代器(特定equal_range的开始和结束)
这样做的动机是我有一个名为sortedword2word的multimap,我用它来检测字符串数组中的字谜.所以我想有一种方法可以轻松地迭代每个相等的范围(很容易就像LOC /可读性方式 - 我知道我可以通过手动检查.end()轻松完成它,如果下一个与当前相同... )
如果boost已经实现了这样的功能,那也是可以接受的.
基本上我无法理解这一点:(来自Bjarne FAQ)
但是,大多数现代处理器不能读取或写入单个字符,它必须读取或写入整个单词,因此对c的赋值实际上是"读取包含c的单词,替换c部分,然后再将单词写回". '由于对b的赋值是相似的,所以即使线程没有(根据它们的源文本)共享数据,两个线程也有很多机会相互冲突!
那么char数组如何在元素之间没有3(7?)字节填充的情况下存在?
c++ ×10
c++11 ×3
boost ×1
c# ×1
equal-range ×1
exception ×1
iterator ×1
linkage ×1
memory-model ×1
sizeof ×1
static ×1
stl ×1
unique-ptr ×1