草庐IT

c++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

c++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

c++ - 可变模板别名作为模板参数

首先是一些代码,然后是一些上下文,然后是问题:templateusingid=T;templateclassF,typename...T>usingapply1=F;templateclassF>structapply2{templateusingmap=F;};//...cout()::map()clang3.3和gcc4.8.1都编译这个没有错误,将标识元函数应用于int,所以这两个表达式的计算结果都是默认的int(零)。id的事实是template而apply1,apply2期待template首先确实让我担心。然而,这个例子很方便,因为否则像apply1这样的元函数。,appl

c++ - 可变模板别名作为模板参数

首先是一些代码,然后是一些上下文,然后是问题:templateusingid=T;templateclassF,typename...T>usingapply1=F;templateclassF>structapply2{templateusingmap=F;};//...cout()::map()clang3.3和gcc4.8.1都编译这个没有错误,将标识元函数应用于int,所以这两个表达式的计算结果都是默认的int(零)。id的事实是template而apply1,apply2期待template首先确实让我担心。然而,这个例子很方便,因为否则像apply1这样的元函数。,appl

c++ - C++0x 中模板别名的灵 active

据我了解,C++0x中的模板别名将允许我们执行以下操作:templateusingDictionary=std::map;Dictionaryints;ints["one"]=1;ints["two"]=2;我有两个问题:首先,我们能否做到这一点(绑定(bind)到任何类型,或者只是模板):templateusingValueType=std::iterator_traits::value_type;其次,使用别名需要在模板中使用typename关键字,例如:templatetypenameValueTypesum(Iterfirst,Iterlast){...}//^required

c++ - C++0x 中模板别名的灵 active

据我了解,C++0x中的模板别名将允许我们执行以下操作:templateusingDictionary=std::map;Dictionaryints;ints["one"]=1;ints["two"]=2;我有两个问题:首先,我们能否做到这一点(绑定(bind)到任何类型,或者只是模板):templateusingValueType=std::iterator_traits::value_type;其次,使用别名需要在模板中使用typename关键字,例如:templatetypenameValueTypesum(Iterfirst,Iterlast){...}//^required

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - 模板别名和特化

假设我们有templatestructFoo{};templatestructBar{};templateclassC>structPack{templateusingContainer=C;};是Foo和Pack::Container如果我们有Foo的特化,应该被视为相同的东西?那就是:templateclassC>structIsFoo:std::false_type{};templatestructIsFoo:std::true_type{};static_assert(IsFoo::value,"Onlyfoos!");static_assert(IsFoo::Containe

c++ - 模板别名和特化

假设我们有templatestructFoo{};templatestructBar{};templateclassC>structPack{templateusingContainer=C;};是Foo和Pack::Container如果我们有Foo的特化,应该被视为相同的东西?那就是:templateclassC>structIsFoo:std::false_type{};templatestructIsFoo:std::true_type{};static_assert(IsFoo::value,"Onlyfoos!");static_assert(IsFoo::Containe