小编Dia*_*ius的帖子

为什么作用域枚举允许使用| 使用先前分配的值进行初始化时的运算符?

我正在将无范围的枚举转换为范围枚举,并且遇到了一个难题。

斯特劳斯,C ++编程语言,第4版,第8.4.1节中,作用域枚举类不隐式转换为整数类型,并为运营商提供的代码文件|,并&为如何用一个例子static_cast来工作的解决这一问题。

使用|运算符对先前定义的enum值进行的以下初始化不合法吗?

enum class FileCopy {
    PreviousHDUs   = 1,
    CurrentHDU     = 2,
    FollowingHDUs  = 4,
    AllHDUs        = PreviousHDUs | CurrentHDU | FollowingHDUs,
    CurrentHeader  = 8
};

int main()
{
    std::cout << static_cast<int>( FileCopy::AllHDUs) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

我已经在Wandbox上使用clang和gcc HEAD进行了测试--pedantic-errors,它会编译并返回预期的输出7。这并不是说合法,只是编译器似乎接受了它。

是否有明确记录的行为?我一直无法以描述此行为的方式来解析文档

c++ enums bitwise-operators language-lawyer

12
推荐指数
2
解决办法
199
查看次数

Google Test无法找到用户提供的相等运算符

我正在使用Google Test v1.7

我创建了一个自定义operator ==ASSERT_EQ无法找到,但如果能直接使用被发现.这是代码

#include <vector>
#include <deque>

#include "gtest/gtest.h"

template< typename T> struct bar { T b; };

template< typename T>
bool operator == ( const std::vector<T>& v, const bar<T>& b ) { return false; }

template< typename T>
bool operator==(  const std::vector<T>& v , const std::deque<T>& d) { return false; }

TEST( A, B ) {

    std::vector<char> vec;
    std::deque<char> deq;
    bar<char> b;

    // compiles
    ASSERT_EQ( vec, b );

    // compiles
    vec == deq; …
Run Code Online (Sandbox Code Playgroud)

c++ googletest

11
推荐指数
2
解决办法
1353
查看次数

带有共享符号的安全隔离专区会导致Perl调试器出现问题

我正在使用Perl 5.22.1.安全2.39

我正在调试一个程序,它偶然在一个安全隔间中运行代码.代码执行从另一个包共享的子例程.我对隔间中运行的代码不感兴趣,但无法避免其执行.执行共享子例程时,Perl调试器在隔离专区内晃动.

这是测试代码:

use warnings;
use strict;

use Safe;

sub MyPkg::foo { 33; }

my $safe= Safe->new;
$safe->share_from( 'MyPkg', [ '&foo' ] );
print $safe->reval(q[foo]), "\n";
print STDERR $@ if $@;
Run Code Online (Sandbox Code Playgroud)

直接运行时,我得到预期的输出:

% perl tdebug.pl
33
Run Code Online (Sandbox Code Playgroud)

但是,在Perl调试器下运行时,调试器非常不满意:

% perl -d tdebug.pl

Loading DB routines from perl5db.pl version 1.49
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main::(tdebug.pl:8):    my $safe= Safe->new;
                                                                                                                                                                   DB<1> c

Undefined subroutine &MyPkg::foo called at [...]/lib/5.22.1/perl5db.pl line 4183.
Debugged …
Run Code Online (Sandbox Code Playgroud)

perl

7
推荐指数
1
解决办法
115
查看次数

使用Sub :: Quote弱化捕获

我想削弱Sub :: Quote生成的代码中的捕获变量.例如,这是未引用的替代方案:

use 5.10.0;
use Scalar::Util qw[ weaken ];
{
  my $s = 'foo';
  my $x = sub { say $s };
  weaken( my $y = $x );

  my $bar = sub { &$y };
  &$bar;
  $x = undef;
  &$bar
}
Run Code Online (Sandbox Code Playgroud)

和输出:

foo
Can't use an undefined value as a subroutine reference [...]
Run Code Online (Sandbox Code Playgroud)

这是我的Sub :: Quote尝试:

use 5.10.0;
use Sub::Quote;
use Scalar::Util qw[ weaken ];
{
  my $s = 'foo';
  my $x = sub { say $s …
Run Code Online (Sandbox Code Playgroud)

perl moo

5
推荐指数
1
解决办法
74
查看次数

Moo,惰性属性和默认/强制调用

我的基于Moo的类具有惰性和非惰性属性,这两个属性都具有sub defaultcoercesubs.如果我没有初始化属性,我发现为普通属性调用了both defaultcoercesubs,但只default调用了lazy属性.这似乎不一致.这是示例代码:

package Foo;
use Moo;

has nrml => ( is => 'ro',
              default => sub { print "nrml default\n" },
              coerce  => sub { print "nrml coerce\n" } 
            );

has lazy => ( is => 'ro',
              lazy => 1,
              default => sub { print "lazy default\n" },
              coerce  => sub { print "lazy coerce\n" }
            );



my $q = Foo->new( );

$q->lazy;
Run Code Online (Sandbox Code Playgroud)

输出是:

nrml default
nrml coerce
lazy default
Run Code Online (Sandbox Code Playgroud)

coerce …

perl moo

3
推荐指数
1
解决办法
2119
查看次数

标签 统计

perl ×3

c++ ×2

moo ×2

bitwise-operators ×1

enums ×1

googletest ×1

language-lawyer ×1