问题标签 [static-assert]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
18880 浏览

c++ - 即使模板函数在任何地方都没有调用,static_assert 也无法编译

我使用带有标志 c++0x 的 g++ 4.6.3(当前是 ubuntu 12.04 的默认包),我偶然发现了这个:

编译错误:

即使我还没有在任何地方调用这个函数

它是一个 g++ 错误吗?仅当在代码中的某处调用此函数时才应实例化此函数。

0 投票
2 回答
149 浏览

c++ - C++11有没有办法静态测试方法访问级别?

C++11 添加了许多新的类模板,允许静态测试类型特征,即在编译时检测问题。我正在为一个类编写一个测试,我需要确保给定的方法是公开的。

“动态”解决方案是创建一个对象并调用该方法,如果它不起作用,编译器会抱怨。但是可能会发生不同类型的错误,这会使生成的错误消息更加混乱。如果可能,最好使用静态断言测试方法访问级别。

有可能还是我真的必须为此创建一个对象?

(另外,如果我需要该方法是私有/受保护的,我该怎么办)

0 投票
4 回答
171 浏览

c++ - 确定是否将相同的指针传递给宏

有一组宏,用于调试、日志记录、堆栈跟踪显示等。其中一个是:

这是我编写的宏的简化版本。如果断言(运行时)失败,我有自定义断言对话框,将此类空检查失败记录到日志文件中。还编写了宏,以便在编译时检查非指针(静态断言)。

现在,我正在寻找一些静态断言来检查两个指针​​是否实际上相同。例子:

应该引发编译器错误,因为宏的两个参数是相同的。我不在乎指针是否指向相同的内存(因为那是运行时的)。

我试过这样的表达:

它们都没有给出被零除的编译器错误。另外,我尝试过使用void*模板参数的模板:

但它不允许将局部变量指针传递给模板非类型参数。

我正在使用VC9,它不支持constexpr关键字(甚至 VS2012 也不支持)。我尝试使用 'const' 代替,这不会引发错误。我还将表达式用作数组大小,这总是会导致错误。

0 投票
1 回答
126 浏览

c++ - 包含非 Copyable 对象的对象的编译警告不可读

我之前问过一个类似的问题,但现在我想更具体一点。我面临的问题是我有一个包含不可复制对象的对象,当有人想要使用我的接口并且他没有很好地使用它(尝试使用对象的复制构造函数)时,他会得到一个编译错误,它将指向对象而不是他的实际代码。所以有两个问题:1.我可以以某种方式修复它以将其指向他的原始代码行吗?2.如果我不能,我怎么能放一个只有在有人真正尝试使用副本c'tor时才会发生的static_assert(我已经尝试了一些但即使有人不使用它我也会得到它们...... )

我正在添加示例代码和编译错误,以防我不理解...注意最后一个编译错误指向 ObjectHolder h。文件..虽然我希望它指向主要的谢谢!

*是我替换名称时的错误。实际上是导致编译错误的代码。让我们假设我不想实现一个私人复制 c'tor 只是为了转发残疾复制

0 投票
3 回答
7215 浏览

c++ - /boost/lockfree/queue.hpp:错误:静态断言失败:(boost::has_trivial_destructor::价值)

我正在尝试在此文件中boost::lockfree::queue替换https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppstd::queue

我添加了#include <boost/lockfree/queue.hpp>;将行130, std::queue<action> m_actions;, 更改为boost::lockfree::queue<action> m_actions;; 删除了所有与锁定有关的行;并将行103, m_actions.pop();, 更改为m_actions.pop(a);.

在添加到项目根目录并在目录中使用's后,我scons broadcast_server_lockfree在项目根目录中遇到这些错误:broadcast_server_lockfree = SConscript('#/broadcast_server_lockfree/SConscript',variant_dir = builddir + 'broadcast_server_lockfree',duplicate = 0)SConstructbroadcast_serverSConstructbroadcast_server_lockfree

我对 C++ 几乎一无所知,并且对错误的搜索没有产生任何结果(因为我不知道我在读什么)。

boost::lockfree::queue如果有帮助, 这是示例。http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

请告诉我如何纠正这个问题。

action

0 投票
1 回答
633 浏览

c++ - 在编译时比较静态字段指针

我有一个从类 A 派生的类 B。A 声明了一个静态字段 f,而 B 可能声明了一个类似的同名字段。以下不起作用:

尽管理论上可以在编译时检查这些断言,但它们是不允许的,因为常量表达式不能获取地址。

有没有办法在编译时进行这种检查?

0 投票
2 回答
1172 浏览

c++ - 我在 C++11 中从未见过的代码

我在看这个源代码

我想知道这是否甚至是有效的C++。

这是什么?不专业的模板专业化?

为什么结构声明里面有代码行

我很困惑..

0 投票
2 回答
1175 浏览

c++ - 使用 static_assert() 提供更好的编译时错误(比编译器)

const昨天,我花了很长时间才解决由从非对象调用成员函数引起的编译时错误const,如下例所示:

clang 错误消息是几行而且太神秘(没有提到const),但是 gcc 提出了一个更好的错误(虽然更多行,但最终抱怨我忽略了 cv 限定符)。

所以,为了避免将来发生这种事情,我考虑static_assert()在我的实用程序头中使用。我幼稚的做法

失败,因为编译器会立即触发错误,即使模板void add_child() const从未被调用。我还能如何完成这项工作?

0 投票
2 回答
4004 浏览

c++ - 静态断言和 SFINAE

考虑一下:

除了明显缺少标题之外,这应该编译吗?

换句话说,我在询问是否请求在推断重载函数模板的返回值时在尾随 decltype 内触发的静态断言失败来停止编译,或者是否必须简单地丢弃重载。

在 gcc 4.7 上,编译失败。我很肯定这将在 gcc 4.8 中编译好(但此时无法检查)。谁是对的?

0 投票
3 回答
4466 浏览

c++11 - 如何使用 C++11 static_assert 进行类型约束?

如何static_assert进行特定类型约束?

目前我想让我的模板只用于unsigned int类型,而不是signed int类型。或者,仅适用于整数类型或特定类型名称。static_assert(sizeof(int))仅提供基于大小的断言,我不知道如何执行任何额外的检查。

libc++在 Xcode 4.6.2 中使用 Clang。这是命令行上的当前编译器信息。