小编Joh*_*itb的帖子

别名模板专业化

别名模板(14.5.7)可以明确专门化(14.7.3)吗?

我的标准fu失败了,我找不到要测试的编译器.

文本"当模板ID引用别名模板的特化时"意味着,但是然后该示例似乎引用了其他内容,暗示没有.

NB.我在n3242工作,一个在FDIS后面,其中这一部分的标题是"别名模板".大声笑.

c++ templates c++11

30
推荐指数
4
解决办法
2万
查看次数

重载分辨率和数组:应该调用哪个函数?

考虑以下程序:

#include <cstddef>
#include <cstdio>

void f(char const*&&)      { std::puts("char const*&&");      } // (1)
void f(char const* const&) { std::puts("char const* const&"); } // (2)

template <std::size_t N>
void f(char const (&)[N])  { std::puts("char const(&)[N]");   } // (3)

int main()
{
    const char data[] = "a";
    f(data);
}
Run Code Online (Sandbox Code Playgroud)

哪个f应该叫?为什么?

三个编译器的最新发布版本不同意这个问题的答案:

  • 当使用g ++ 4.5.2编译程序时调用(1)
  • 使用Visual C++ 2010 SP1编译程序时调用(2)
  • 使用Clang 3.0(trunk 127530)编译程序时调用(3 )

在不同的C++ 0x草案中,重载决策规则是否发生了很大变化?或者,这两个编译器真的完全错了吗?哪个重载是根据最新的C++ 0x草案选择的正确重载?

c++ arrays reference overload-resolution c++11

29
推荐指数
1
解决办法
1665
查看次数

operator ++作为后缀和前缀不适用于clang

我试着写一个可以用作前缀和后缀运算符的运算符

#include <iostream>
#include <utility>

struct B { 
  // ...
};

template<typename ...T>
void operator++(B, T...) {
  std::cout << ((sizeof...(T) == 0) ? "prefix" : "postfix") << std::endl;
}

int main() {
  B b;
  b++;
  ++b;
}
Run Code Online (Sandbox Code Playgroud)

GCC编译并且可以正常工作,但是clang说

main.cpp:9:24:error:重载后增量运算符的参数必须是'int'类型(不是'T ...')

void operator++(B, T...) {
Run Code Online (Sandbox Code Playgroud)

谁是对的?


感谢任何帮助我了解GCC行为的人.我提交了一份新的Clang错误报告:

http://llvm.org/bugs/show_bug.cgi?id=14995

c++ templates operators language-lawyer c++11

28
推荐指数
1
解决办法
880
查看次数

C++ 0x中C++枚举的基础类型

我一直试图阅读一些C++标准来弄清楚枚举是如何工作的.实际上比我原先想象的更多.

对于作用域枚举,int除非使用enum-base子句(它可以是任何整数类型)另外指定,否则基本类型是明确的.

enum class color { red, green, blue};  // these are int
Run Code Online (Sandbox Code Playgroud)

对于无范围的枚举,似乎底层类型可以是任何可以工作的整数类型,并且它不会大于int,除非它需要.

enum color { red, green, blue};  // underlying type may vary
Run Code Online (Sandbox Code Playgroud)

由于基础类型的无范围激励不是标准化的,处理序列化实例的最佳方法是什么?到目前为止,我一直在转换到int写入时串行化intenum在读取时将变量设置在开关中,但它似乎有点笨拙.有没有更好的办法?

enum color { red, green, blue };
color c = red;
// to serialize
archive << (int)c;
// to deserialize
int i;
archive >> i;
switch(i) {
  case 0: c = red; break;
  case 1: c = green; break;
  case 2: c = blue; break;
}
Run Code Online (Sandbox Code Playgroud)

c++ enums c++11

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

C++模板的两阶段名称查找 - 为什么?

为什么C++标准为模板定义了两个阶段查找?非依赖声明和定义的查找是否也可以推迟到实例化阶段?

c++ templates dependent-name name-lookup

27
推荐指数
1
解决办法
5002
查看次数

为什么GCC和Clang不进行混叠优化?

我有一个案例,朋友将类型为"Base"的非基类对象强制转换为类类型对象"Derived",其中"Derived"是"Base"的派生类,只添加函数,但没有数据.在下面的代码中,我确实x向派生类添加了一个数据成员

struct A {
  int a;
};

struct B : A {
  // int x;
  int x;
};

A a;

int g(B *b) {
   a.a = 10;
   b->a++;
   return a.a;
}
Run Code Online (Sandbox Code Playgroud)

通过严格的别名分析,GCC(也是Clang)总是返回10,而不是11,因为b永远不会指向a明确定义的代码.但是,如果我删除B::x(因为实际上是在我朋友的代码的情况下),GCC的输出汇编代码并没有优化的回归访问a.a并重新加载从内存中值.因此我的朋友的代码g在GCC(按照他的意图)调用"有效",即使我认为它仍然有未定义的行为

g((B*)&a);
Run Code Online (Sandbox Code Playgroud)

因此,在基本相同的两种情况下,GCC优化了一种情况并且没有优化另一种情况.是因为b可以合法地指出a?或者是因为GCC只是想破坏现实世界的代码?


我测试了答案

如果删除B :: x,那么B符合9p7中对标准布局类的要求,并且访问变得非常明确,因为这两种类型是布局兼容的,9.2p17.

有两个布局兼容的枚举

enum A : int { X, Y };
enum B : int { Z …
Run Code Online (Sandbox Code Playgroud)

c++ optimization gcc strict-aliasing compiler-optimization

27
推荐指数
2
解决办法
1406
查看次数

什么是`std :: nullptr_t`模板参数的正确用例?

今天我开始知道C++允许类型的非类型模板参数std::nullptr_t:

template<std::nullptr_t N> struct A { };

template<std::nullptr_t N> void f() { } 
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法想出任何明智的用例.任何人都可以为此提出理由吗?

c++ templates

26
推荐指数
2
解决办法
2251
查看次数

枚举:他们可以用.h或者必须留在.cpp吗?

如果我有类似的东西:

enum
{
    kCP_AboutBox_IconViewID = 1,
    kCP_AboutBox_AppNameViewID = 2,
    kCP_AboutBox_VersionViewID = 3,
    kCP_AboutBox_DescriptionViewID = 4,
    kCP_AboutBox_CopyrightViewID = 5
};
Run Code Online (Sandbox Code Playgroud)

在我的.cpp中可以进入.h吗?

更重要的是,除了类定义,变量等之外,还可以将其他更少的知识放入.h中

c++ header

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

带有附加可选模板参数的标准库容器?

在文章中多次阅读索赔 - 我想将此问题添加到Stackoverflow,并询问社区 - 以下代码是否可移植?

template<template<typename T, typename Alloc> class C>
void f() {
  /* some code goes here ... */
}

int main() {
  f<std::vector>();
}
Run Code Online (Sandbox Code Playgroud)

供应的实施是否std::vector真的允许有两个众所周知的额外的,默认的模板参数?这会使上面的代码格式错误,因为它假设有两个模板参数.见最后一段在这篇文章中对这种要求的一个例子.

c++ parameters standards templates stl

25
推荐指数
1
解决办法
1325
查看次数

错字与"cout <myint".它为什么有效?

我有这个代码,我搜索了几个小时,为什么它无法打印我的收入

int const income = 0;
std::cout << "I'm sorry, your income is: " < income;
Run Code Online (Sandbox Code Playgroud)

直到我发现我错过了写<<但写道<.为什么编译器没有检测到这个并且错误输出?我不确定为什么比较cout有意义?

c++ iostream

25
推荐指数
1
解决办法
612
查看次数