我在之前的一个问题中提到过,我正在阅读Herb Sutter和Andrei Alexandrescu撰写的"C++编码标准"一书.在其中一章中他们说的是这样的:
始终在构造函数体中而不是在初始化列表中执行非托管资源获取,例如其结果未立即传递给智能指针构造函数的新表达式.
这是否意味着我应该使用这种形式的构造(假设data_3_必须用new初始化):
SomeClass(const T& value, const U& value2, const R& value3)
: data_(value), data_2_(value2)
{
data_3_ = new value3;
}
Run Code Online (Sandbox Code Playgroud)
代替:
SomeClass(const T& value, const U& value2, const R& value3)
: data_(value), data_2_(value2), data_3_(new value3)
// here data_3_ is initialized in ctor initialization list
// as far as I understand that incorrect way according to authors
{
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
PS如果这就是他们的意思,为什么他们使用术语非托管资源获取?我一直认为这些资源是"手动管理"的?
PS 2.我很抱歉,如果这篇文章中有任何格式问题 - 我不得不承认 - 我绝对讨厌在这个论坛上格式化的方式.
我试图将相同的键多次插入到地图中但具有不同的值.它不起作用.我知道operator []做了这个工作,但我的问题是,如果插入的这种行为是正确的吗?不应该插入()插入?我不知道标准是什么.不幸的是我没有它(标准的C++)所以我无法检查.
谢谢你有用的ansers.
在哪里检查是否定义了long long类型?我想做这样的事情:
#ifdef LONGLONG
#define long_long long long
#else
#define long_long long
#endif
Run Code Online (Sandbox Code Playgroud) 伙计们,我正在从"The C++ Programming Language 3rd ed"做练习.在页340上有一个功能的例子:
template <class T, class C = Cmp<T> > // Here is a default argument
// But as far as I'm concerned it's illegal to have a default argument in
// a function template
int compare (const String<T>& str1, const String<T>& str2)
{
/*Some code*/
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
书中是否有错误或者我错了?
为什么这个代码(M类中的fnc值)不能通过SFINAE规则解决?我收到一个错误:
Error 1 error C2039: 'type' : is not a member of
'std::tr1::enable_if<_Test,_Type>'
Run Code Online (Sandbox Code Playgroud)
当然类型不是成员,它没有在enable_if的这个通用版本中定义,但是如果bool为真,并且如果它是假的则不实例化那么这不是fnc的这个版本背后的全部想法吗?可以请有人向我解释一下吗?
#include <iostream>
#include <type_traits>
using namespace std;
template <class Ex> struct Null;
template <class Ex> struct Throw;
template <template <class> class Policy> struct IsThrow;
template <> struct IsThrow<Null> {
enum {value = 0};
};
template <> struct IsThrow<Throw> {
enum {value = 1};
};
template <template <class> class Derived>
struct PolicyBase {
enum {value = IsThrow<Derived>::value};
};
template<class Ex>
struct Null : PolicyBase<Null> { };
template<class …Run Code Online (Sandbox Code Playgroud) cout << typeid(int&).name();
Run Code Online (Sandbox Code Playgroud)
在我看来,这应该int&作为一种类型而不是一种类型返回int,而是在GCC 4.5.1和VS2010 SP1 beta上返回int.为什么是这样?
有没有人记录过具有前后条件的函数或方法?(我问,因为我的老师说这是正式/正确的方式):
传说:(因为我无法输入特殊字符)3 - 将其读作"存在"和"存在"
E - 是(如在集合中)的成员
A - 对于所有
- > - 暗示
假设s是非空字符串.设B(s)是给出字符串s中位置索引的整数集.
这里开始记录这个函数:
int FirstOccurence(String s, Char c)
precondition:
(s.lenght() > 0) && 3 int i in B(s) [s.charAt(i) == c]
Run Code Online (Sandbox Code Playgroud)
那是等待后置条件的前提条件;)
postcondition:
(FirstOccurence(s,c) E B(s)) && (s.charAt(FirstOccurence(s,c)) == c) &&
A int i B(s)[(i < FirstOccurence(s,c)) --> !(s.charAt(i) == c) ]
Run Code Online (Sandbox Code Playgroud)
你们中的任何一个人是否曾经遇到过在现实世界中记录功能/方法的方式?
signed long long value = -2147483648;
cout << ((signed long long)value);
Run Code Online (Sandbox Code Playgroud)
输出2147483648(没有减号),为什么?
有没有办法结合 static_assert 的输出?我的意思是这样的:
template<class T>
struct X
{
static_assert(std::is_signed<T>::value, "Type " + T + " must be signed.");//this doesn't work
};
Run Code Online (Sandbox Code Playgroud)