小编Naw*_*waz的帖子

将typename关键字与typedef和new一起使用

考虑一下这段代码

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)

在这两种情况下,关键字typedefnew使其足够清楚,无论遵循编译器类型,不是 .

所以我的问题是,为什么编译器仍然需要typename关键字,即使在明确的情况下,例如我们使用typedefnew


编辑(阅读Johannes Schaub的回复后):

//typedef NOT followed by a type!
int typedef A;
Run Code Online (Sandbox Code Playgroud)

这种语法要求我稍微修改一下我的问题,以便我试图做出的观点可能会被其他人看到.

想想这个, …

c++ templates typedef typename language-lawyer

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

在try-with-resources中声明的变量注释?

只是想知道哪些注释可以用于在try-with-resources语句中声明的变量,这是根据其语法允许的.语言规范(Java 7)的第14.20.3节内容如下:

TryWithResourcesStatement:
    tryResourceSpecification Block Catches opt最后选择

ResourceSpecification:
    (资源;选择 )

资源:
    资源;资源

资源:
    VariableModifiers opt类型VariableDeclaratorId =表达式

VariableModifiers扩展为(第14.4节),

VariableModifiers:
    VariableModifier
    VariableModifiers VariableModifier

VariableModifier:
    Annotation之一 final

你去:VariableModifier可以有注释.嗯,这基本上意味着,我们可以这样写:

try( @SomeAnnotation SomeType obj = createSomeType() ) { 
  //some code
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何以及什么样的注释可以用于资源尝试并实现什么样的行为?任何创新的想法?有人用过它们吗?

java annotations java-7 java-8 try-with-resources

20
推荐指数
2
解决办法
1001
查看次数

程序员何时使用空基优化(EBO)

我正在阅读有关空基优化(EBO)的内容.在阅读时,我脑海中浮现出以下问题:

  1. 对类派生类没有任何贡献(无论是功能方面还是数据方面),使用Empty类作为基类有什么意义

  2. 本文中,我读到了这个:

// S是空
类struct T:S
{
      int x;
};

[...]

请注意,我们没有丢失任何数据或代码准确性:当您创建S类型的独立对象时,对象的大小仍然是之前的1(或更多); 只有当S被用作另一个类的基类时,它的内存占用量才会缩小到零.为了实现这种节省的影响,想象一个包含125,000个对象的向量.仅EBO就可以节省半兆内存!

这是否意味着如果我们不使用"S"作为"T"的基类,我们必然会消耗两倍的兆字节内存?我认为,这篇文章比较了我认为不正确的两种不同情景.

我想知道一个真实的情景时,EBO可以证明是有用的.(手段,在相同的情况下,我们就一定是在亏损,如果我们不使用EBO!).

请注意,如果您的答案包含以下解释:

整点是一个空类的大小非零,但是当派生或派生时它的大小为零,那么我就不会问这个,正如我所知道的那样.我的问题是,为什么有人会从一个空洞的班级中获得他的班级?即使他没有衍生出来并简单地写出他的课程(没有任何空基础),他是否会以任何方式迷失?

c++ optimization memory-management class compiler-optimization

19
推荐指数
4
解决办法
5671
查看次数

使用默认构造函数初始化数组

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# arrays array-initialize default-constructor

19
推荐指数
3
解决办法
4万
查看次数

如何在C#中存在全局函数?

当在类中定义所有内容时,如何在C#中存在全局函数?我正在MSDN 阅读OpCodes.Call的文档,并惊讶地看到以下措辞,

元数据令牌携带足够的信息以确定调用是静态方法,实例方法,虚拟方法还是全局函数.

全球功能?它存在于C#中吗?(它绝对不是指static方法,因为它与全局函数一起明确列出).

c# global function

19
推荐指数
3
解决办法
2万
查看次数

lambda中的递归调用(C++ 11)

可能重复:
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体中的其他语句如何). …

c++ lambda type-inference auto c++11

18
推荐指数
2
解决办法
7794
查看次数

GCC和clang(SFINAE)之间的过载分辨率行为差异

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++ gcc templates clang overload-resolution

18
推荐指数
2
解决办法
4639
查看次数

C++ for-loop - size_type vs. size_t

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++ for-loop vector size-type

17
推荐指数
3
解决办法
2万
查看次数

使用未初始化的变量和编译器(GCC)的乐趣

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

17
推荐指数
1
解决办法
2621
查看次数

我应该何时更喜欢非会员非朋友功能到会员功能?

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,clearHistoryremoveCookies他们自己.

对我而言,便利功能的例子是合理的.但是当非会员版本擅长时,除了便利功能之外还有其他例子吗?

更一般地说,什么时候使用哪些规则

c++ encapsulation

17
推荐指数
1
解决办法
2449
查看次数