草庐IT

static-initializer

全部标签

c++ - static const std::map<string, int> vs if-elseif

我编写了一个将字符串转换为数字的函数。我看到了两种可能的写法:intconvert(conststd::stringinput){if(input=="one"){return1;}elseif(input=="two"){return2;}//etc.return0;}或者intconvert(conststd::stringinput){staticconstmaptable={{"one",1},{"two",2}//etc.}constautoresult=table.find(input);if(result==table.end()){return0;}returnresu

c++ - `static constexpr` 在常量表达式中调用的函数是...错误?

我有以下代码:classMyClass{staticconstexprboolfoo(){returntrue;}voidbar()noexcept(foo()){}};我希望因为foo()是一个staticconstexpr函数,并且由于它是在声明bar之前定义的,所以这将是完全可以接受。但是,g++给了我以下错误:error:‘staticconstexprboolMyClass::foo()’calledinaconstantexpression这...没什么用,因为在常量表达式中调用函数的能力是constexpr的全部要点。clang++更有帮助。除了指出noexcept的参数

c++ - `static constexpr` 在常量表达式中调用的函数是...错误?

我有以下代码:classMyClass{staticconstexprboolfoo(){returntrue;}voidbar()noexcept(foo()){}};我希望因为foo()是一个staticconstexpr函数,并且由于它是在声明bar之前定义的,所以这将是完全可以接受。但是,g++给了我以下错误:error:‘staticconstexprboolMyClass::foo()’calledinaconstantexpression这...没什么用,因为在常量表达式中调用函数的能力是constexpr的全部要点。clang++更有帮助。除了指出noexcept的参数

c++ - 带 auto 的 initializer_list 包含多个表达式

相当简单的问题,autox11{1,2,3,4};autox1={1,2,3,4};autox22{1.0,2.25,3.5};autox2={1.0,2.25,3.5};据我了解,这里是否有=应该没有区别。但是,使用llvm/clang6.0.0(使用--std=c++17),我得到:main1.cpp:35:17:error:initializerforvariable'x11'withtype'auto'containsmultipleexpressionsautox11{1,2,3,4};~~~~~~~~^main1.cpp:37:20:error:initializerfor

c++ - 带 auto 的 initializer_list 包含多个表达式

相当简单的问题,autox11{1,2,3,4};autox1={1,2,3,4};autox22{1.0,2.25,3.5};autox2={1.0,2.25,3.5};据我了解,这里是否有=应该没有区别。但是,使用llvm/clang6.0.0(使用--std=c++17),我得到:main1.cpp:35:17:error:initializerforvariable'x11'withtype'auto'containsmultipleexpressionsautox11{1,2,3,4};~~~~~~~~^main1.cpp:37:20:error:initializerfor

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>

当给出以下结构的代码时templatevoidfoo(Args&&...args){...}我经常看到库代码使用static_cast在用于参数转发的函数中。通常,这样做的理由是使用static_cast避免不必要的模板实例化。给定语言的引用折叠和模板推导规则。我们通过static_cast获得完美的转发,此声明的证明如下(在误差范围内,我希望答案能启发)当给定右值引用时(或为了完整性-没有像thisexample中的引用限定),这会折叠引用,结果是一个右值。使用的规则是&&&&->&&(规则1以上)当给定左值引用时,这会折叠引用以使结果是左值。这里使用的规则是&&&->&(规则2以上

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>

当给出以下结构的代码时templatevoidfoo(Args&&...args){...}我经常看到库代码使用static_cast在用于参数转发的函数中。通常,这样做的理由是使用static_cast避免不必要的模板实例化。给定语言的引用折叠和模板推导规则。我们通过static_cast获得完美的转发,此声明的证明如下(在误差范围内,我希望答案能启发)当给定右值引用时(或为了完整性-没有像thisexample中的引用限定),这会折叠引用,结果是一个右值。使用的规则是&&&&->&&(规则1以上)当给定左值引用时,这会折叠引用以使结果是左值。这里使用的规则是&&&->&(规则2以上

c++ - Initializer-list-构造一个不可复制(但可 move )对象的 vector

可以将不可复制但可move类型的右值push_back放入该类型的vector中:#includestructS{S(int);S(S&&);};intmain(){std::vectorv;v.push_back(S(1));v.push_back(S(2));v.push_back(S(3));}但是,当我尝试使用相同的右值初始化vector列表时,我收到有关需要复制构造函数的错误:#includestructS{S(int);S(S&&);};intmain(){std::vectorv={S(1),S(2),S(3)};}我在使用GCC4.7时遇到以下错误:Infileincl

c++ - Initializer-list-构造一个不可复制(但可 move )对象的 vector

可以将不可复制但可move类型的右值push_back放入该类型的vector中:#includestructS{S(int);S(S&&);};intmain(){std::vectorv;v.push_back(S(1));v.push_back(S(2));v.push_back(S(3));}但是,当我尝试使用相同的右值初始化vector列表时,我收到有关需要复制构造函数的错误:#includestructS{S(int);S(S&&);};intmain(){std::vectorv={S(1),S(2),S(3)};}我在使用GCC4.7时遇到以下错误:Infileincl

c++ - 何时使用 `static_assert` 而不是 SFINAE?

我一直在使用(并且看到使用)static_assert来标记模板参数值的不想要的值。但是,对于我遇到的所有情况,通过SFINAE禁用那些不需要的值似乎更好、更优雅。例如:template::value>::type>structFoo{...};代替:templatestructFoo{static_assert(std::is_floating_point::value,"Foo:Tmustbefloatingpoint:-(");...};所以我的问题是:我什么时候应该使用static_assert而不是SFINAE,为什么?编辑:我认为到目前为止我学到的内容如下:1.SFINAE