考虑一下这段代码
template<class T>
struct Sample
{
typename T::X *x; //declare pointer to T's X
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,typename编译器需要关键字,以便它可以消除模板中嵌套类型和嵌套值之间的歧义.这意味着,在没有typename关键字的情况下,编译器会将此解释为T :: X与x的乘法,
T::X *x; //multiply T::X with x
Run Code Online (Sandbox Code Playgroud)
因此,在可能出现歧义的情况下,关键字typename变得必要,以便消除歧义.但是,上下文本身消除歧义的情况很少.在其它主题讨论基类和函数参数的上下文(后者不虽然除去模糊).在这个主题中,我特别想讨论其他两个似乎毫不含糊的背景,但我们仍然需要写typename,
typedef typename T::X xtype;
pX = new typename T::X;
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,关键字typedef和new使其足够清楚,无论遵循编译器类型,不是 值.
所以我的问题是,为什么编译器仍然需要typename关键字,即使在明确的情况下,例如我们使用typedef和new?
//typedef NOT followed by a type!
int typedef A;
Run Code Online (Sandbox Code Playgroud)
这种语法要求我稍微修改一下我的问题,以便我试图做出的观点可能会被其他人看到.
想想这个, …
只是想知道哪些注释可以用于在try-with-resources语句中声明的变量,这是根据其语法允许的.语言规范(Java 7)的第14.20.3节内容如下:
TryWithResourcesStatement:
tryResourceSpecification Block Catches opt最后选择ResourceSpecification:
(资源;选择)资源:
资源;资源资源:
VariableModifiers opt类型VariableDeclaratorId=表达式
而VariableModifiers扩展为(第14.4节),
VariableModifiers:
VariableModifier
VariableModifiers VariableModifierVariableModifier:
Annotation之一final
你去:VariableModifier可以有注释.嗯,这基本上意味着,我们可以这样写:
try( @SomeAnnotation SomeType obj = createSomeType() ) {
//some code
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如何以及什么样的注释可以用于资源尝试并实现什么样的行为?任何创新的想法?有人用过它们吗?
我正在阅读有关空基优化(EBO)的内容.在阅读时,我脑海中浮现出以下问题:
当对类派生类没有任何贡献时(无论是功能方面还是数据方面),使用Empty类作为基类有什么意义?
在本文中,我读到了这个:
// S是空
类struct T:S
{
int x;
};[...]
请注意,我们没有丢失任何数据或代码准确性:当您创建S类型的独立对象时,对象的大小仍然是之前的1(或更多); 只有当S被用作另一个类的基类时,它的内存占用量才会缩小到零.为了实现这种节省的影响,想象一个包含125,000个对象的向量.仅EBO就可以节省半兆内存!
这是否意味着如果我们不使用"S"作为"T"的基类,我们必然会消耗两倍的兆字节内存?我认为,这篇文章比较了我认为不正确的两种不同情景.
我想知道一个真实的情景时,EBO可以证明是有用的.(手段,在相同的情况下,我们就一定是在亏损,如果我们不使用EBO!).
整点是一个空类的大小非零,但是当派生或派生时它的大小为零,那么我就不会问这个,正如我所知道的那样.我的问题是,为什么有人会从一个空洞的班级中获得他的班级?即使他没有衍生出来并简单地写出他的课程(没有任何空基础),他是否会以任何方式迷失?
c++ optimization memory-management class compiler-optimization
public class Sample
{
static int count = 0;
public int abc;
public Sample()
{
abc = ++Sample.count;
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个上面的类数组,并希望通过调用默认构造函数来初始化数组中的每个元素,以便每个元素可以有不同的abc.所以我这样做:
Sample[] samples = new Sample[100];
Run Code Online (Sandbox Code Playgroud)
但这并不符合我的想法.这似乎是默认构造函数没有被调用.如何在创建数组时调用默认构造函数?
我也想知道上面的陈述是做什么的?
当在类中定义所有内容时,如何在C#中存在全局函数?我正在MSDN 阅读OpCodes.Call的文档,并惊讶地看到以下措辞,
元数据令牌携带足够的信息以确定调用是静态方法,实例方法,虚拟方法还是全局函数.
全球功能?它存在于C#中吗?(它绝对不是指static方法,因为它与全局函数一起明确列出).
可能重复:
c ++ 0x中的递归lambda函数
如果我把它写成:为什么我不能递归地调用lambda:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
Run Code Online (Sandbox Code Playgroud)
它给出了编译错误(ideone):
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
Run Code Online (Sandbox Code Playgroud)
错误是什么意思?
我理解为什么我不能写这个:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
Run Code Online (Sandbox Code Playgroud)
我们不能写这个,因为i必须从它的初始化推断出类型,这意味着如果i自身出现在初始化(ideone)中,则无法推断出类型.但是,如果是lambda,它又如何重要?如果我没错,lambda的类型由它的参数和返回类型决定; 它不依赖于身体,如果它什么都不返回(在这种情况下,返回类型被推断为void,无论lambda体中的其他语句如何). …
GCC接受以下代码:
template <typename T>
struct meta
{
typedef typename T::type type;
};
struct S {};
template <typename T>
typename meta<T>::type foo(T, S);
int foo(int, int);
int main()
{
foo(0, 0);
}
Run Code Online (Sandbox Code Playgroud)
但是clang拒绝它并出现以下错误:
test.cpp:4:22: error: type 'int' cannot be used prior to '::' because it has no members
typedef typename T::type type;
^
test.cpp:10:10: note: in instantiation of template class 'meta<int>' requested here
typename meta<T>::type foo(T, S);
^
test.cpp:10:24: note: while substituting deduced template arguments into function template 'foo' [with T …Run Code Online (Sandbox Code Playgroud) 在C++ Primer第3章的书中,有以下for循环将向量中的元素重置为零.
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix)
ivec[ix] = 0;
Run Code Online (Sandbox Code Playgroud)
它为什么用vector<int>::size_type ix = 0?我们不能说int ix = 0吗?在第二种形式上使用第一种形式有什么好处?
谢谢.
C++标准的第3.9.1/6节说,
bool类型的值是
true或者false.
现在考虑这段代码,
void f(bool b)
{
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
}
int main()
{
bool b; //note : b is uninitialized
f(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编 F:\workplace>g++ test.cpp -pedantic
跑.输出:
不可能的价值
出乎意料的输出?嗯,不是真的,因为标准在§3.9.1/ 6的脚注中读到:
以本国际标准描述的方式将bool值用作 "未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假 …
c++ compiler-construction gcc initialization undefined-behavior
Meyers在他的书"Effective C++"中提到,在某些情况下,非成员非朋友函数比成员函数更好地封装.
例:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
Run Code Online (Sandbox Code Playgroud)
许多用户希望一起执行所有这些操作,因此WebBrowser也可能提供一个功能:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是定义非成员非朋友函数.
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
Run Code Online (Sandbox Code Playgroud)
非成员函数更好,因为"它不会增加可以访问类的私有部分的函数的数量.",从而导致更好的封装.
喜欢的功能clearBrowser是方便的功能,因为他们不能提供任何功能的WebBrowser一些其他方式的客户端无法获得已.例如,如果clearBrowser不存在,客户可以只打电话clearCache,clearHistory和removeCookies他们自己.
对我而言,便利功能的例子是合理的.但是当非会员版本擅长时,除了便利功能之外还有其他例子吗?
更一般地说,什么时候使用哪些规则?