别名模板(14.5.7)可以明确专门化(14.7.3)吗?
我的标准fu失败了,我找不到要测试的编译器.
文本"当模板ID引用别名模板的特化时"意味着是,但是然后该示例似乎引用了其他内容,暗示没有.
NB.我在n3242工作,一个在FDIS后面,其中这一部分的标题是"别名模板".大声笑.
考虑以下程序:
#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
应该叫?为什么?
三个编译器的最新发布版本不同意这个问题的答案:
在不同的C++ 0x草案中,重载决策规则是否发生了很大变化?或者,这两个编译器真的完全错了吗?哪个重载是根据最新的C++ 0x草案选择的正确重载?
我试着写一个可以用作前缀和后缀运算符的运算符
#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 ...')
Run Code Online (Sandbox Code Playgroud)void operator++(B, T...) {
谁是对的?
感谢任何帮助我了解GCC行为的人.我提交了一份新的Clang错误报告:
我一直试图阅读一些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
写入时串行化int
并enum
在读取时将变量设置在开关中,但它似乎有点笨拙.有没有更好的办法?
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++标准为模板定义了两个阶段查找?非依赖声明和定义的查找是否也可以推迟到实例化阶段?
我有一个案例,朋友将类型为"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++允许类型的非类型模板参数std::nullptr_t
:
template<std::nullptr_t N> struct A { };
template<std::nullptr_t N> void f() { }
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法想出任何明智的用例.任何人都可以为此提出理由吗?
如果我有类似的东西:
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中
在文章中多次阅读索赔 - 我想将此问题添加到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
真的允许有两个众所周知的额外的,默认的模板参数?这会使上面的代码格式错误,因为它假设有两个模板参数.见最后一段在这篇文章中对这种要求的一个例子.
我有这个代码,我搜索了几个小时,为什么它无法打印我的收入
int const income = 0;
std::cout << "I'm sorry, your income is: " < income;
Run Code Online (Sandbox Code Playgroud)
直到我发现我错过了写<<
但写道<
.为什么编译器没有检测到这个并且错误输出?我不确定为什么比较cout
有意义?
c++ ×10
templates ×5
c++11 ×4
arrays ×1
enums ×1
gcc ×1
header ×1
iostream ×1
name-lookup ×1
operators ×1
optimization ×1
parameters ×1
reference ×1
standards ×1
stl ×1