#include <exception>
constexpr bool foo(bool x)
{
return x ? true : throw std::exception();
}
int main()
{
// 1) must never be compiled
// static_assert(foo(false), "");
// 2) must always be compiled?
const bool x = foo(false);
// 3) must never compile?
constexpr bool y = foo(false);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我确信(1)必须导致编译错误.我很确定(2)在编译时不能被拒绝,尽管它会在运行时失败.
有趣的案例是constexpr变量(3).在这个简单的例子中,gcc和clang实际上会计算表达式,因此会拒绝该程序.(错误消息:y不是常量表达式).
每个C++ 11编译器都被迫拒绝该程序吗?如果foo(false)被更复杂的表达式替换怎么办?
我很惊讶地发现constexpr没有图灵完整,虽然它将在规范发生变化之后: 基于constexpr的计算Turing是否完整?
也许这与我的问题有关.据我所知,允许编译器推迟在本例中对constexpr(3)的实际评估,直到运行时.但是如果constexpr是turing-complete,我发现很难相信编译器可以决定是否所有constexpr都会抛出异常(这意味着constexpr无效).
我想提高大型项目的构建速度.opt构建使用-O2 -g编译.我注意到没有-g,编译变得更快,大约10-20%.生成的二进制文件具有足够的信息来分析崩溃,除了行号.有没有办法包括行号信息,但没有别的?
根据http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html,行号仅在级别2(即-g2或默认值-g)或更高级别生成.但根据这个http://gcc.gnu.org/wiki/DebugFission,行号只是调试信息的一小部分(1%).所以对我来说最好是-g0或-g1但是有行号.这可能吗?
最好的问候,马丁
假设您拥有通常永远不会失败的功能,例如:
std::string convert_integer_to_string(int x);
Run Code Online (Sandbox Code Playgroud)
在市政当局,这将是一个候选人noexcept.但是,实现最有可能涉及动态内存管理,因此在为运算符分配内存时,它总是会抛出std :: bad_allocnew.
是否建议将该函数注释为noexcept?
从实际的角度来看,以合理的方式处理内存不足的情况是极其困难的.大多数程序只假设有足够的可用内存.std::terminate正如在某个noexcept函数抛出时所发生的那样,调用std::bad_alloc在这种情况下似乎是合理的.
对我来说noexcept是某种形式的文档.这是一个承诺,你(或优化器)可以安全地假设这个函数永远不会抛出.如果您正在编写一个不关心内存不足情况的应用程序,那么它仍然是一个有效的假设.
我想最安全的建议是noexcept如果std::bad_alloc抛出异常就永远不要使用.另一方面,我想知道是否有优势可以使用noexcept,假设您不关心内存不足的情况(即,如果std::terminate可以).
我正在为*nix操作系统编写一个多线程c ++应用程序.有效终止此类应用程序的最佳做法是什么?我的直觉是我想在SIGINT(SIGTERM?)上安装一个信号处理程序来停止/加入我的线程.此外,是否可以"保证"所有析构函数都被调用(假设在处理信号时没有抛出其他错误或异常)?
我正在尝试编写一个辅助函数来以类型安全的方式比较两种类型:
typesafeEquals("abc", new Integer(42)); // should not compile
Run Code Online (Sandbox Code Playgroud)
我的第一次直接尝试失败了:
<T> boolean typesafeEquals(T x, T y) { // does not work!
return x.equals(y);
}
Run Code Online (Sandbox Code Playgroud)
那么,问题是T可以推断出是一个Object.现在,我想知道typesafeEquals在Java类型系统中是否无法实现.
我知道FindBugs找到的工具可以警告不兼容类型的比较.无论如何,要么看到没有外部工具的解决方案,要么解释为什么它是不可能的,这将是有趣的.
更新:我认为答案是不可能的.但是,我没有证据支持这种说法.只是似乎很难找到适用于所有情况的解决方案.
一些答案很接近,但我相信Java的类型系统不支持在所有普遍性中解决问题.
是否有关于Java 8功能的最新概述,Kotlin尚不支持?
例如,调用Map#putIfAbsent等默认方法无法编译(不支持的引用错误):
import java.util.*
fun main(args: Array<String>) {
val x : Map<Int, Int> = HashMap<Int, Int>()
x.putIfAbsent(1, 2)
}
Run Code Online (Sandbox Code Playgroud)
如果覆盖默认方法,则它可以工作:
import java.util.*
fun main(args: Array<String>) {
val x : HashMap<Int, Int> = HashMap<Int, Int>()
x.putIfAbsent(1, 2)
}
Run Code Online (Sandbox Code Playgroud)
这就是我通过实验发现的,但是为了决定是否已经可以从Java 8代码基础迁移到Kotlin,系统的概述将是有价值的.
更新:我的示例中的代码是由"Java to Kotlin"转换器创建的.正如user2235698指出的那样,Map<Int, Int>是一个不可变的Kotlin地图.但是,当我将其更改为java.util.Map地图时,该示例无法编译.然而,我声称它必须使用默认方法做一些事情会产生误导.
由于它超出了这个问题的范围,我在这里开了一个后续问题:java.util.HashMap在Kotlin中没有实现java.util.Map吗?
我没有找到关于其实现复杂性的声明.
通常,查找连通分量可以在线性时间内完成,例如通过广度优先搜索或深度优先搜索(参见维基百科文章).但是,假设您可以将图形保留在内存中.GraphX实现了一个分布式的核外算法,因此我认为它不具有可比性.
你知道他们的算法如何工作以及它有多复杂性?
algorithm time-complexity apache-spark connected-components spark-graphx
Lombok支持生成带@Inject注释的构造函数:
@RequiredArgsConstructor(onConstructor = @__(@Inject))
Run Code Online (Sandbox Code Playgroud)
所以,而不是
@Service
public class FooService {
private final BarService barService;
@Inject
public FooService(BarService barService) {
this.barService = barService;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以写
@Service
@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class FooService {
private final BarService barService;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是它似乎打破了IntelliJ中的Spring IDE支持:
BarService).如果我是唯一的开发人员,我会使用第一个版本并完成它.但是,我发现代码库中越来越多的代码被迁移到Lombok构造函数样式.所以,我很好奇:
是否可以将IDEA中的完整Spring支持与Lombok onConstructor = @__(@Inject)构造函数结合使用?
假设您有一个Spring应用程序从配置服务器获取其配置.如果它无法连接到配置服务器,应用程序将继续启动,但由于缺少所有配置,它最终会因潜在的误导性错误而失败.
是否可以配置Spring,因此在启动期间无法连接到其配置服务器时会立即中止?
Eclipse具有@NonNullByDefault注释,它将所有值视为@NonNull除非您明确地将它们注释为@Nullable.
IntelliJ IDEA中是否有等效选项,或者您是否必须始终使用@Nonnull?
java ×5
c++ ×4
c++11 ×2
spring ×2
algorithm ×1
apache-spark ×1
bad-alloc ×1
compilation ×1
constexpr ×1
debugging ×1
gcc ×1
generics ×1
java-8 ×1
kotlin ×1
lombok ×1
noexcept ×1
null ×1
signals ×1
spark-graphx ×1
type-erasure ×1
type-safety ×1
type-systems ×1
unix ×1