相关疑难解决方法(0)

是否所有C++编译器都允许使用静态const int类成员变量作为数组绑定?

在VC++中,当我需要指定一个绑定类成员变量的数组时,我这样做:

 class Class {

 private:
     static const int numberOfColors = 16;
     COLORREF colors[numberOfColors];
 };
Run Code Online (Sandbox Code Playgroud)

(请不要告诉我在这里使用std :: vector)

这样我就有了一个常量,可以用作数组绑定,稍后在类代码中指定循环语句约束,同时在其他任何地方都不可见.

问题是static const int成员变量的这种用法是仅由VC++允许还是其他广泛编译器通常允许的?

c++ static const visual-c++

8
推荐指数
5
解决办法
1987
查看次数

我在哪里可以找到有关C++/STL方法异常保证的信息?

前几天我正在编写带有异常处理的代码,我有一些关于异常,它们的保证和抛出的问题.

基本上,说你有:

class X {
string m_str;
X() : m_str("foo")//what if this throws?
{
    ifstream b("a.in")//what if this throws?
}
Run Code Online (Sandbox Code Playgroud)

在浏览了我能找到的所有文章之后,我仍然不知道处理这个问题的干净方法是什么.

说我有一个像这样的代码:

{
    ...
    X myInstanceOfClassX;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我应该把代码包装catch(exception &)好吗?如果我这样做,确实stringifstream保证有一个强有力的保证,没有资源泄露,没有任何东西被打开一半?

此外,如果我的类抛出myexception,这是从异常派生的,catch(exception &)似乎让它通过.那么让我看到catch(...)哪个IIRC可以访问违规行为?还有另外一种方法吗?

然后在某处有一条信息,不应该捕获在对象构造函数的子构造函数中抛出的任何异常,并且构造函数应该抛出以防任何成员对象抛出.

如果上面的代码不是从构造函数调用,而是从常规函数调用void foo(),我应该捕获哪些异常呢?outofmemory_something,filenotfound_something?我在哪里可以找到STL对象可以抛出的定义?它们的实施是否具体?

权威来源在哪里可以清除我对此主题的所有怀疑和疑问?

到目前为止,处理异常似乎就像在一大堆gooo中跳舞一样.错误代码似乎更简单,更安全......

c++ exception-handling

8
推荐指数
1
解决办法
463
查看次数

ostream等效于%.2f或%.2lf

double d = 1/2.;
printf("%.2lf\n", d);
Run Code Online (Sandbox Code Playgroud)

打印出来0.50.这就是我想用ostream操纵器复制的内容.但是,没有一个明显的iomanip操纵器允许我设置所需的最小小数位(如果我理解正确,则setprecision设置最大宽度).有没有纯粹iostreamboost方法这样做?

c++ precision iostream

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

C++字符串是如何存储的?

可能重复:
std :: string及其自动调整内存大小

我只是很好奇,字符串是如何存储在内存中的?例如,当我这样做时:

string testString = "asd";
Run Code Online (Sandbox Code Playgroud)

它分配4个字节,对吧?a + s + d + \0.

但是后来,当我想为这个字符串分配一些新文本时,它可以工作,但我不明白如何.例如,我这样做:

testString = "123456789"
Run Code Online (Sandbox Code Playgroud)

现在它应该是10个字节长.但是如果没有这种字符串的空间呢?假设字符串开头的第五个+第六个字节被其他一些字符占用.CPU如何处理它?它在内存中找到了全新的位置,该字符串适合?

c++ memory string

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

空括号调用默认构造函数或构造函数采用std :: initializer_list吗?

以下是Effective Modern C++(第55页)的引用:

"假设你使用一组空的大括号来构造一个支持默认构造函数的对象,并且还支持std :: initializer_list构造.你的空括号是什么意思?等规则是你得到默认构造."

我用std :: array尝试过这个:

std::array<int, 10> arr{};
Run Code Online (Sandbox Code Playgroud)

并得到了g ++(版本4.8.2)的警告:

警告:缺少成员'std :: array <int,10ul> :: _ M_elems'的初始值设定项

这是在尝试std::array从空构造一个时得到的警告std::initializer_list(请参阅为什么我可以从{}初始化一个常规数组,而不是std :: array来讨论此警告).

那么,为什么上面的代码行不能解释为调用默认构造函数?

c++ aggregate-initialization c++11

8
推荐指数
1
解决办法
1113
查看次数

何时返回值的复制构造函数发生

我有以下成员函数:

Person ClassB::DoSomethingAndReturnPerson()
{
 RAIIMutex myLock(&m_mutex);
 return m_person;
}
Run Code Online (Sandbox Code Playgroud)

RAIIMutex 是一个辅助类,它接收互斥锁并将其锁定在构造函数中并在析构函数中释放.

m_person是类型Person(尺寸非常小).其他线程中的其他函数可能会更改此成员.

我希望m_person按值返回(返回副本),当然我想避免m_person在返回时复制另一个线程时被更改的情况,所以我添加了锁.

但首先会发生什么?编译器是先创建一个m_person或者先调用析构函数的副本myLock吗?

从理论上讲,它可以通过这样的方式轻松解决:

Person ClassB::DoSomethingAndReturnPerson()
{
 RAIIMutex myLock(&m_mutex);
 Person tmp = m_person;
 return tmp;
}
Run Code Online (Sandbox Code Playgroud)

但我很想知道我的问题的答案.

谢谢

c++ return language-lawyer

8
推荐指数
1
解决办法
261
查看次数

C++字符串类擦除成员函数的时空复杂度

我想知道是否有人知道 C++ string::erase 函数的实现及其复杂性。我知道 C++ 字符串是一个字符对象。我假设它不会分配和创建一个新的字符对象,然后从旧字符串 O(n) 和 O(n) 空间复制字符。它是否在字符 O(n) 和 O(1) 空间上移动?我查看了 cplusplus.com 和 Bjarne Stroustrup 的书,但没有找到答案。有人可以指出我实现它的源代码或知道答案吗?

谢谢!

c++ time-complexity space-complexity

8
推荐指数
1
解决办法
3142
查看次数

为什么 'int' 在 C++ 中只用作 int 而为什么不用作 std::int ?

standard当前 C++ 中的所有内容不同,是否有任何特定原因要离开int, char, ....main()和其他人。(不是说+, -, %,.. 因为它们不是特定于语言的)

为什么不像:

std::int std::main(std::int argc, std::char *argv[])
{
    //Sample C++ code (incorrect with current standards though)
    std::return 0;
}
Run Code Online (Sandbox Code Playgroud)

超出标准范围的标准化不是不完整的吗?

我相信,它们是编写程序时随处可见的基本组件,无论是简单的还是复杂的。它们不包含在标准化中,只是为了遵循DRY原则。

c++ standards std

8
推荐指数
2
解决办法
604
查看次数

C标准malloc'ing字符的潜在问题

在回答对我的另一种答案评论在这里,我找到了我想可能是在C标准(孔C1X,我没有检查的早期的,是的,我知道这是令人难以置信的可能性不大,我独自所有中行星的居民在标准中发现了一个错误).信息如下:

  1. 第6.5.3.4节("运营商规模")第2段规定"The sizeof operator yields the size (in bytes) of its operand".
  2. 该部分第3段指出:"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1".
  3. 第7.20.3.3节描述void *malloc(size_t sz)但所有内容都是"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate".它根本没有提到用于论证的单位.
  4. 附件E开始时8是最小值,CHAR_BIT因此字符长度可以超过一个字节.

我的问题很简单:

在char为16位宽的环境中,将malloc(10 * sizeof(char))分配10个字符(20个字节)或10个字节?上面的第1点似乎表示前者,第2点表示后者.

任何比我更有C-standard-fu的人都有这个答案?

c malloc standards sizeof c11

7
推荐指数
1
解决办法
806
查看次数

GCC 4.4.1错误是因为不接受ctor-initializer中的注入类名?

GCC 4.4.1拒绝在ctor-initializer中找到我的注入类名:

template <typename T>
struct Base
{
    Base(int x) {}
};

struct Derived : Base<int>
{
    Derived() : Base(2) {}
};

int main()
{
    Derived d;
}
Run Code Online (Sandbox Code Playgroud)
test2.cpp: In constructor "Derived::Derived()":
test2.cpp:9: error: class "Derived" does not have any field named "Base"
test2.cpp:9: error: no matching function for call to "Base<int>::Base()"
test2.cpp:4: note: candidates are: Base<T>::Base(int) [with T = int]
test2.cpp:3: note:                 Base<int>::Base(const Base<int>&)
Run Code Online (Sandbox Code Playgroud)

不过,GCC 4.8 编译得很好.

我确信这应该有效,我找不到任何不同意我的标准措辞.

这是一个GCC 4.4.1错误,对吗?

(我确实冲过GCC Bugzilla,但没有任何相关内容突然出现在我面前.)

c++ gcc

7
推荐指数
1
解决办法
258
查看次数