根据与c ++ 0x相关的N2628,非静态数据成员初始化器可以被显式定义的构造函数覆盖,但它似乎对隐式定义的复制构造函数略显模糊.
特别是,我注意到使用Apple clang 3.0版时,行为会根据结构(或类)是否为POD而有所不同.
以下程序返回输出"1",表示复制构造函数忽略右侧,而是替换新的非静态数据成员初始值设定项(在此示例中,X :: a的布尔值为true) ).
#include <iostream>
#include <string>
struct X
{
std::string string1;
bool a = true;
};
int main(int argc, char *argv[])
{
X x;
x.a = false;
X y(x);
std::cout << y.a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,令人困惑的是,如果你注释掉string1:
// std::string string1;
Run Code Online (Sandbox Code Playgroud)
然后行为按照我的预期工作(输出为"0"),大概是因为没有隐式生成的复制构造函数,因此复制了数据.
C++ 0x规范是否真的建议允许隐式定义的拷贝构造函数不复制右侧的内容?这不是那么有用和不直观吗?我发现非静态成员初始化程序功能非常方便,但如果这是正确的行为,那么由于其棘手和不直观的行为,我将明确地避免使用该功能.
请告诉我,我错了?
更新:此错误已在Clang源存储库中修复.见此修订版.
更新:此错误在Apple clang 3.1版(标签/ Apple/clang-318.0.45)中出现(基于LLVM 3.1svn).这个版本的clang是作为Lion的Xcode 4.3的一部分发布的.
在大多数用于窗口环境的多文档编辑器中,Control-TAB将利用MRU列表将用户带回到最后一个可见文件.在XCode 3.x中完成此操作的适当命令是什么?
我目前将Ctrl-TAB映射到"View | Previous File",但这似乎不是MRU.更糟糕的是,如果它命中列表的"开头"(应该是一个循环缓冲区),它会回退到在文本编辑器中插入一个实际的TAB字符.
我想在LESS中表达以下CSS:
.a {
min-height: calc(2em + 4px);
}
Run Code Online (Sandbox Code Playgroud)
因此,为了防止LESS尝试计算,我使用LESS 转义语法编写了表达式:
.a {
min-height: ~'calc(2em + 4px)';
}
Run Code Online (Sandbox Code Playgroud)
然而,LESS的缩小引擎正在移除空白,并发出:
.a{min-height:calc(2em+4px);}
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为webkit无法正确计算2em+4px,而2em_+_4px工作正常(为了清晰起见,添加了下划线.)似乎这里的真正错误是在webkit中,因为我希望CSS3 calc的语法允许令牌之间不存在空格.
如果我不处理if语句的其他条件,我想让编译器警告我.这是否存在于clang或gcc中?
为了澄清,我并不是想让我的所有源代码都开启.但是,有时整个文件或大量的代码,我根本无法承受不考虑每一个其他块的设计.因此,我想,我真的在寻找一个pragma,我可以打开和关闭以启用和禁用几千行非常重要的代码.
想象它是一个自动代码审查或静态分析工具.
要说编译器不能这样做,因为它是合法的......在实践中不是问题.我见过的每个C/C++编译器都会很乐意发出大量警告,以防止在语法和语义上完全有效的代码.(例如在gcc中,-Wunused-value,-Wunused-label,-Wunreachable-code等...)
我的问题与存在模糊类型中间值时的类型类实例推导有关
Prelude> :t fromInteger 0
fromInteger 0 :: Num a => a
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
Prelude> :t (==) (fromInteger 0)
(==) (fromInteger 0) :: (Eq a, Num a) => a -> Bool
Prelude> :t (==) (fromInteger 0) (fromInteger 1)
(==) (fromInteger 0) (fromInteger 1) :: Bool
Prelude> (==) (fromInteger 0) (fromInteger 1)
False
Run Code Online (Sandbox Code Playgroud)
魔法!目前还不清楚是如何或是否a具体,但代码运行成功!
根据类型推断规则,a 上面表示的类型变量彼此成功统一,因为它们Num a在不同的术语中具有兼容的约束.但是,a永远不要绑定到具体类型.我的问题是,在运行时,该(==)函数使用哪个实例字典(或专业化,等等)?
这是Haskell依赖于简单的二进制memcmp样式比较的情况吗?或者它可能只是在其实例列表中选择第一个实例,Num …