小编Gra*_*rak的帖子

如果没有括号

我希望编译以下代码.Clang和VC++都给我一个错误else.

void MyFunction(std::int32_t& error)
{
   std::int32_t variable = 0;
   if(GetSomething())
      error = EOK;
   else
      error = ERROR;
}
Run Code Online (Sandbox Code Playgroud)

如果我把花括号括起来error = EOK;,那就编译.为什么VC++说:

非法的其他没有匹配if


我的完整代码如下,用typedef替换std :: uint32_t.它仍然在VC++中给出相同的错误.

using sint32 = int;

#define ERROR 5;
#define EOK 0;

bool GetSomething();

void MyFunction(sint32& error)
{
   sint32 variable = 0;
   if (GetSomething())
      error = EOK;
   else
      error = ERROR;
}
Run Code Online (Sandbox Code Playgroud)

c++ if-statement

39
推荐指数
2
解决办法
4401
查看次数

将std :: make_unique与自定义删除器一起使用

在使用std::unique_ptr自定义删除器时,我希望使用std::make_unique而不是原始的新删除器.我正在使用VC++ 2013.在我看来,std::unique_ptr如果您使用自定义删除器,则无法使用.我错过了什么,或者这是真的吗?


附加信息:

我正在使用a std::unique_ptr<HANDLE, custom_deleter>来保存打开的COM端口的Windows HANDLE.

我可以为此编写一个自定义RAII类,它不会非常困难,但我看到它的使用难度/难度/难度std::unique_ptr.

c++ c++11 c++14

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

Clang和GCC接受可疑​​的大小

我有编译器对sizeof不同意.对于以下代码,Clang和GCC将编译它,但我必须使用的其他编译器声明"非法sizeof操作数".我对标准的解读说这是非法的,因为sizeof只能表达(我不认为S :: a是表达式)或类型id,但GCC和Clang两者都是错误的.我显然可以替换它sizeof(S().a),它适用于我的所有编译器.

struct S
{
   int a[32];
   int b;
   int c;
   int d[32];
};

int main()
{
   return sizeof(S::a);
}
Run Code Online (Sandbox Code Playgroud)

Clang和GCC是错的,还是我误读标准?

c++ c++11

18
推荐指数
1
解决办法
730
查看次数

如何使用auto声明数组

我一直在玩,auto我注意到在大多数情况下你可以用一个变量定义替换auto,然后分配类型.

在下面的代码wx都相等(默认情况下初始化int,还是让我们无法进入潜在副本).有没有办法声明z它具有相同的类型y

int w{};
auto x = int{};
int y[5];
auto z = int[5];
Run Code Online (Sandbox Code Playgroud)

c++ auto c++11

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

该功能是否覆盖基本功能?

我有三个不同的编译器,我用来编译这段代码.其中一个(我最信任的那个)警告Derived中的函数隐藏了Base中的函数.其他编译器(一个是Visual C++)没有警告.如果我启用/ Wall或/ W4,Visual C++甚至不会发出警告.

我倾向于认为这是编译器中的一个错误,它会发出警告,因为它编译代码.如果它确实没有覆盖基函数,那么当我创建派生模板的实例时它应该给出错误.

任何人都可以确认这应该如何表现?

struct Base
{
   virtual void Func(float f) = 0;
};

template <typename T>
struct Derived : Base
{
   virtual void Func(T f){}
};

int main()
{
   Derived<float> d;
   d.Func(0);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

什么时候Derived实例化float我得到意外的警告.当Derived被实例化与int我得到一个错误,符合市场预期.

c++ c++11

16
推荐指数
1
解决办法
412
查看次数

是否保证静态对象被初始化

我试图了解静态对象的初始化.假设你理解常量表达式,静态初始化似乎很简单constexpr.动态初始化似乎有点棘手.

[basic.start.init/4

实现定义是否在第一个main语句之前完成具有静态存储持续时间的非局部变量的动态初始化.如果初始化延迟到第一个main语句之后的某个时间点,则应该在与要初始化的变量相同的转换单元中定义的任何函数或变量的第一个odr-use(3.2)之前发生.

脚注34

具有静态存储持续时间的非局部变量必须初始化,即使它没有使用odr-used(3.2,3.7.1).

[basic.start.init]/5

实现 - 定义是否在线程的初始函数的第一个语句之前完成具有静态或线程存储持续时间的非局部变量的动态初始化.如果初始化被推迟到线程初始函数的第一个语句之后的某个时间点,它应该在任何变量的第一个odr-use(3.2)之前发生,其中线程存储持续时间与变量在同一个转换单元中定义要初始化.

我假设"线程的初始函数"是指main,而不仅仅是以std :: thread开头的线程.

h1.h

#ifndef H1_H_
#define H1_H_

extern int count;

#endif
Run Code Online (Sandbox Code Playgroud)

tu1.cpp

#include "h1.h"

struct S
{
   S()
   {
      ++count;
   }
};

S s;
Run Code Online (Sandbox Code Playgroud)

tu2.cpp

#include "h1.h"

int main(int argc, char *argv[])
{
   return count;
}
Run Code Online (Sandbox Code Playgroud)

tu3.cpp

#include "h1.h"

int count;
Run Code Online (Sandbox Code Playgroud)

因此,如果编译器推迟动态初始化,脚注34似乎表明s必须在某个时刻进行初始化.由于在转换单元中没有其他具有动态初始化的变量,因此没有其他变量可用于强制初始化tu1中的变量.什么时候s保证已经初始化?

主要保证返回1吗?还有,有什么方法可以改变这个程序,使其不再保证返回1?或者,如果不能保证,有没有办法改变这个程序,以保证它?


我打破了代码,以便定义与s不同的翻译单元main.这避免了是否main使用odr 的问题.鉴于这s是翻译单元中唯一的对象,是否保证main会返回1?

c++ c++11

13
推荐指数
1
解决办法
897
查看次数

如何使用std :: aligned_union

在尝试学习如何使用std :: aligned_union时,我无法找到任何示例.我的尝试遇到了一些我不知道如何解决的问题.

struct include
{
    std::string file;
};
struct use
{
    use(const std::string &from, const std::string &to) : from{ from }, to{ to }
    {
    }
    std::string from;
    std::string to;
};
std::aligned_union<sizeof(use), include, use>::type item;
*reinterpret_cast<use*>(&item_) = use{ from, to };
Run Code Online (Sandbox Code Playgroud)

当我尝试在VC++ 2013调试模式下运行程序时,我收到运行时错误memcpy(unsigned char * dst, unsigned char * src, unsigned long count).我假设这是VC++从临时实现赋值的方式.

我如何改变这一点,以便我没有这个问题?

c++ c++11

9
推荐指数
2
解决办法
2779
查看次数

将模板参数与模板类型匹配

我如何编写模板或constexpr代码,match只有在Ts包含实例的情况下才是真的A

template <std::uint32_t, int, int>
struct A;

template <typename... Ts>
struct X
{
    constexpr bool match = ???;
};
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

9
推荐指数
1
解决办法
156
查看次数

函数调用可以重新排序

我正在使用C++ 98.函数调用在多大程度上可以重新排序?我没有使用任何全局状态,只使用函数本地的对象状态.

我的具体情况是:

{
  RaiiType T;
  Object1.FunctionCall();
  Object2.FunctionCall();
}
Run Code Online (Sandbox Code Playgroud)

Object1和Object2在下一个范围内声明的位置.是否T允许在函数调用之后重新排序构造函数,假设它可以被简单地证明(至少对于人类)构造和函数调用之间没有依赖关系?


在我的特定情况下,RAII对象用于计算函数调用的执行时间.

c++

8
推荐指数
1
解决办法
689
查看次数

从参数包中获取typedef

我有这种形式的结构:

template <typename T>
struct X
{
    using value = T;
};
Run Code Online (Sandbox Code Playgroud)

我将其中一个或多个传递给模板函数,如下所示:

template <typename... Ts>
void Func(Ts... ts);
Run Code Online (Sandbox Code Playgroud)

我真正想要的是明确列出Xs并使函数参数类型为values Ts.我该怎么办?

c++ templates c++11

8
推荐指数
1
解决办法
247
查看次数

标签 统计

c++ ×10

c++11 ×8

templates ×2

auto ×1

c++14 ×1

if-statement ×1