如果我声明了一个基类(或接口类)并为其一个或多个参数指定了一个默认值,那么派生类是否必须指定相同的默认值,如果没有,哪些默认值将在派生类中显示?
附录:我也对如何在不同的编译器中处理这个问题以及在这种情况下对"推荐"实践的任何输入感兴趣.
是否可以通过lambda表达式中的const引用进行捕获?
我希望下面标记的作业失败,例如:
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string strings[] =
{
"hello",
"world"
};
static const size_t num_strings = sizeof(strings)/sizeof(strings[0]);
string best_string = "foo";
for_each( &strings[0], &strings[num_strings], [&best_string](const string& s)
{
best_string = s; // this should fail
}
);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新:由于这是一个老问题,如果C++ 14中有设施来帮助解决这个问题,那么更新它可能会更好.C++ 14中的扩展是否允许我们通过const引用捕获非const对象?(2015年8月)
当我尝试使用构建程序时Eclipse CDT
,我得到以下内容:
/mingw/lib/libmingw32.a(main.o):main.c:(.text+0x106):未定义引用`WinMain @ 16
这是为什么?而且,我该如何解决这个问题呢?
在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.
盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.
如何在我的dll界面中使用stl-classes?什么是常见做法?
或者,"俄罗斯人如何抛出异常?"
std :: exception的定义是:
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
Run Code Online (Sandbox Code Playgroud)
一个思想的流行学设计异常层次结构是从的std ::例外得出:
通常,最好抛出对象,而不是内置函数.如果可能,您应该抛出从(最终)从std :: exception类派生的类的实例.通过使您的异常类从标准异常基类继承(最终),您可以让您的用户更轻松(他们可以选择通过std :: exception捕获大部分内容),而且您可能正在为他们提供更多信息(例如,您的特定异常可能是std :: runtime_error或其他任何内容的改进).std :: runtime_error或其他).
但是面对Unicode,似乎不可能设计一个能够实现以下两个目的的异常层次结构:
使用可以使用Unicode字符串构造的异常类非常简单.但标准规定what()必须返回一个const char*,因此在某些时候输入字符串必须转换为ASCII.无论是在构造时完成还是调用what()(如果源字符串使用的字符不能用7位ASCII表示),可能无法在不丢失保真度的情况下格式化消息.
如何设计一个异常层次结构,它结合了std :: exception派生类与无损Unicode诊断的无缝集成?
通过阅读C++标准,我一直都知道C++中的整数基本类型的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)
我从3.9.1/2中推断出这个:
- 有四种带符号的整数类型:"signed char","short int","int"和"long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.简单的int具有执行环境的体系结构所建议的自然大小
此外,大小char
由3.9.1 /描述为:
- [...]大到足以存储实现的基本字符集的任何成员.
1.7/1以更具体的术语定义:
- C++内存模型中的基本存储单元是字节.一个字节至少足以包含基本执行字符集的任何成员,并且由连续的位序列组成,其数量是实现定义的.
这导致我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)
where sizeof
告诉我们这个类型的字节数.此外,它是实现定义的字节中有多少位.我们大多数人可能习惯于处理8位字节,但标准表示n
字节中有位.
在这篇文章中,Alf P. Steinbach说:
long保证(至少)32位.
根据标准,这一切都在我理解C++基本类型的大小面前.通常情况下,我只是将这句话视为初学者错误,但由于这是Alf,我认为值得进一步调查.
那么,你呢?标准长期保证至少为32位?如果是这样,请具体说明如何进行此保证.我只是没有看到它.
C++标准特别指出,为了了解C++,你必须知道C(1.2/1)1
C++标准隐含地定义了long
可容纳的值的最小限制LONG_MIN
- LONG_MAX
2
所以无论多大long
,它都必须足够大才能将LONG_MIN保持为LONG_MAX.
但Alf和其他人特别指出,long必须至少为32位.这就是我想要建立的.C++标准明确指出一个字节中的位数没有指定(可能是4,8,16,42)那么连接如何能够容纳数字LONG_MIN-LONG_MAX
至少为32位?
(1)1.2/1:以下参考文件对于本文件的应用是必不可少的.凡是注日期的引用文件,仅引用的版本适用.凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本标准.
(2)定义 …
如果要将某个常量值与类关联,可以使用以下两种方法来实现相同的目标:
class Foo
{
public:
static const size_t Life = 42;
};
class Bar
{
public:
enum {Life = 42};
};
Run Code Online (Sandbox Code Playgroud)
在语法和语义上,从客户的角度来看,它们似乎是相同的:
size_t fooLife = Foo::Life;
size_t barLife = Bar::Life;
Run Code Online (Sandbox Code Playgroud)
除了纯粹的风格之外,还有什么理由可以解释为什么一个人比另一个人更可取?
我正在寻找标准中对这一事实的正式解释.我已经找到了3.9.1/9所说的内容并尝试用该部分作出解释.
第3.9.1/9节,N3797:
void类型具有一组空值.void类型是不完整的类型,无法完成.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cv void(5.4)类型.void类型的表达式只能用作表达式语句(6.2),作为逗号表达式(5.18)的操作数,作为?:( 5.16)的第二个或第三个操作数,作为typeid,noexcept或者操作数的操作数. decltype,作为返回类型为void的函数的返回语句(6.6.3)中的表达式,或者作为显式转换为类型cv void的操作数.
我不明白它是如何暗示void类型有一组空的值?
假设类型T具有一组空值.为什么编译器在遇到以下行时会抛出错误:
extern T v;
Run Code Online (Sandbox Code Playgroud)
我们可以通过以下方式对不完整类型的变量进行decalre:
#include <iostream>
#include <cstring>
using namespace std;
struct Foo;
extern Foo f; //OK!
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
它工作正常
它不能在void类型上完成
#include <iostream>
#include <cstring>
using namespace std;
extern void f; //compile-time error
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
我正在做一些维护工作,遇到类似以下的事情:
std::string s;
s.resize( strLength );
// strLength is a size_t with the length of a C string in it.
memcpy( &s[0], str, strLength );
Run Code Online (Sandbox Code Playgroud)
我知道使用&s [0]如果它是std :: vector会是安全的,但是这是std :: string的安全使用吗?
c++ ×10
c++11 ×4
c++03 ×2
c++14 ×1
class-design ×1
crash-dumps ×1
dll ×1
eclipse ×1
eclipse-cdt ×1
lambda ×1
long-integer ×1
memcpy ×1
standards ×1
std ×1
stdstring ×1
stl ×1
visual-c++ ×1
void ×1
windbg ×1