小编Phi*_*ßen的帖子

编译器是否被迫拒绝无效的constexpr?

#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无效).

c++ language-lawyer constexpr c++11

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

GCC:如何仅生成行号调试信息?

我想提高大型项目的构建速度.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但是有行号.这可能吗?

最好的问候,马丁

c++ debugging gcc compilation

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

永远不要将涉及动态内存分配的函数注释为noexcept?

假设您拥有通常永远不会失败的功能,例如:

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可以).

c++ bad-alloc noexcept c++11

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

C++优雅关闭最佳实践

我正在为*nix操作系统编写一个多线程c ++应用程序.有效终止此类应用程序的最佳做法是什么?我的直觉是我想在SIGINT(SIGTERM?)上安装一个信号处理程序来停止/加入我的线程.此外,是否可以"保证"所有析构函数都被调用(假设在处理信号时没有抛出其他错误或异常)?

c++ unix signals application-shutdown

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

是否可以检测不兼容类型与Java类型系统的比较?

我正在尝试编写一个辅助函数来以类型安全的方式比较两种类型:

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 generics type-systems type-erasure type-safety

9
推荐指数
3
解决办法
551
查看次数

Kotlin:尚不支持Java 8的哪些功能?

是否有关于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吗?

java compatibility java-8 kotlin

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

Spark:GraphX中使用的连通组件算法的时间复杂度是多少?

GraphX附带了一种用于查找图形的连通分量算法.

我没有找到关于其实现复杂性的声明.

通常,查找连通分量可以在线性时间内完成,例如通过广度优先搜索或深度优先搜索(参见维基百科文章).但是,假设您可以将图形保留在内存中.GraphX实现了一个分布式的核外算法,因此我认为它不具有可比性.

你知道他们的算法如何工作以及它有多复杂性?

algorithm time-complexity apache-spark connected-components spark-graphx

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

IDEA与Lombok的Spring支持:是否支持"导航到自动连接的依赖项"?

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支持:

  • 在非Lombok版本中,IDE显示了自动装配参数的来源,并允许我导航到它们的位置(这里是实现BarService).
  • 在Lombok版本中,我无法让它工作.它仍然显示spring bean声明的位置,但不显示自动连接的依赖项的位置.

如果我是唯一的开发人员,我会使用第一个版本并完成它.但是,我发现代码库中越来越多的代码被迁移到Lombok构造函数样式.所以,我很好奇:

是否可以将IDEA中的完整Spring支持与Lombok onConstructor = @__(@Inject)构造函数结合使用?

java spring dependency-injection intellij-idea lombok

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

如果Spring应用程序无法连接到其配置服务器,则会快速失败

假设您有一个Spring应用程序从配置服务器获取其配置.如果它无法连接到配置服务器,应用程序将继续启动,但由于缺少所有配置,它最终会因潜在的误导性错误而失败.

是否可以配置Spring,因此在启动期间无法连接到其配置服务器时会立即中止?

java spring

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

IDEA中是否有@NonNullByDefault注释?

Eclipse具有@NonNullByDefault注释,它将所有值视为@NonNull除非您明确地将它们注释为@Nullable.

IntelliJ IDEA中是否有等效选项,或者您是否必须始终使用@Nonnull

java null static-analysis intellij-idea

8
推荐指数
2
解决办法
2622
查看次数