AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

All perguntas(coding)

Martin Hope
Jordan_B
Asked: 2025-04-25 00:43:24 +0800 CST

Os genéricos constantes do Rust podem usar limites de características com uma desigualdade (por exemplo, N2 > N1)?

  • 12

Estou trabalhando em um projeto no qual estou construindo um tipo de vetor de bits em Rust e estou explorando se é possível restringir genéricos constantes usando limites de desigualdade.

Meu objetivo é projetar uma API que evite a verificação de limites em tempo de execução usando garantias em tempo de compilação baseadas em genéricos constantes, além de uma variante verificada em tempo de execução. Minha esperança é que essas funções sejam simples o suficiente para que o compilador possa embuti-las, de modo que seja uma abstração verdadeiramente de custo zero.

Aqui está um exemplo de código simplificado que demonstra o que estou tentando fazer. Este código não compila, mas mostra o tipo de restrição que desejo:

/// Idea: A function with multiple generic parameters where a 
/// trait bound is used to establish an ordering between them.
fn add_ordered<const N1: usize, const N2: usize>() -> usize 
where N2 > N1 {
    N1 + N2
}

fn main() {
    let n = add_ordered::<1, 2>();
    println!("{n}");
}

Se eu remover a cláusula where N2 > N1, o código será compilado, mas não manterá o tipo de invariante que estou tentando manter aqui (nesse caso, que N2 é maior que N2).

Minhas perguntas:

  • Existe atualmente uma maneira em Rust de escrever uma restrição genérica const como where N2 > N1?
  • Caso contrário, há alguma solução alternativa ou recurso de linguagem (noturno ou não) que permita algo semelhante?
  • Se realmente não há como fazer isso agora, há algum motivo para que não possa ser feito, além do fato de que simplesmente não foi feito? Isso poderia levar a uma possível RFC?

Pesquisei um pouco, mas não consegui encontrar muita coisa sobre isso. Quaisquer dicas ou explicações serão muito apreciadas. Obrigado!

rust
  • 2 respostas
  • 76 Views
Martin Hope
user30224617
Asked: 2025-04-22 22:06:45 +0800 CST

Por que o tipo Unit é tratado de maneira especial em Kotlin?

  • 12

Por favor, explique esse comportamento em Kotlin:

data class A<T>(val p: T)
class B

fun f1(): A<Number> = A(B()) as A<Number>
fun f2(): A<Unit> = A(B()) as A<Unit>

fun main() {
    println("f1: ${f1().p::class.simpleName}") // print "f1: B"
    println("f2: ${f2().p::class.simpleName}") // print "f2: Unit"
}

Eu esperaria a saída "B" tanto no primeiro quanto no segundo caso.

Além disso, curiosamente, ele funciona corretamente para data class A<T>(val p: T?).

É algum tipo de otimização do compilador?

kotlin
  • 1 respostas
  • 165 Views
Martin Hope
HolyBlackCat
Asked: 2025-04-10 15:54:42 +0800 CST

Variáveis ​​são formalmente um conceito de tempo de compilação?

  • 12

Observe que esta é uma pergunta de direito linguístico . Conheço o significado comum de "variável", mas estou tentando entender exatamente o que o padrão chama de "variáveis". Estou escrevendo um material didático e quero usar as definições corretas.


Variáveis ​​são comumente definidas como "objetos nomeados", ou mais corretamente "objetos que foram declarados" (já que variáveis ​​podem não ter nome, mas são sempre declaradas).

Mas há um segundo ponto de vista: variáveis ​​são um conceito de tempo de compilação. Segundo essa definição, uma declaração no código-fonte sempre corresponde a uma variável, mesmo que, em tempo de execução, vários objetos sejam criados a partir dela.

Qual está correta?


Aqui está um exemplo em que isso é importante. Digamos que você tenha

void foo(bool a)
{
    int x = 42;

    if (a)
        foo(false);
}

Quando você chama foo(true), duas instâncias de int x = 42;get existem ao mesmo tempo.

Eles são claramente dois objetos diferentes, mas tecnicamente são variáveis ​​diferentes ou a mesma variável?

Se variáveis ​​são uma coisa de tempo de compilação, então as duas são a mesma variável.


A segunda definição parece errada à primeira vista, mas aqui temos um membro do comitê C++ argumentando que ela é a correta , por exemplo.

c++
  • 2 respostas
  • 203 Views
Martin Hope
Thornsider3
Asked: 2024-06-02 04:58:13 +0800 CST

Visualização digitada possível? Ou estou pensando errado

  • 13

este não é um bug específico, mas uma questão geral de design em C++. Considere o seguinte cenário:

struct MyInterface {};

struct Data : MyInterface{};

struct DataWrapper
{
    SomeContainerOf<MyInterface*> getData()
    {...}
private:
    std::vector<Data> dataStorage;
};

Em termos dos meus requisitos, preciso da função de acesso para DataWrapperretornar um contêiner de MyInterface*valores (ponteiros porque estamos realmente retornando Datavalores).

Idealmente, queremos fazer isso sem fazer uma cópia. Quero saber a melhor maneira de fazer isso. Pelo que posso dizer, algo como o seguinte é a maneira idiomática do C++ de fazer isso:

auto DataWrapper::getData()
{
    return dataStorage
        | std::ranges::views::transform(
            [](Data& d) -> MyInterface* { return &d; }
        );
}

Mas o problema é que está muito claro que esse método acessador é explícito sobre seus valores de retorno - preciso que saibam que esse método retorna essa lista, e estou preocupado que ao fazer o tipo de retorno auto, isso atrapalhe um pouco isso . Parece que (posso estar errado aqui) você não deveria saber qual viewé o tipo de a (em um estilo semelhante aos lambdas)

A alternativa que estou considerando seria fazer uma visualização customizada (onde eu poderia deixar o tipo um pouco mais claro), mas realmente me dói reimplementar algo que está tão claramente no padrão. Qual seria a medida recomendada para tal cenário? O C++ moderno diz que devo manter o valor de retorno auto?

c++
  • 3 respostas
  • 219 Views
Martin Hope
biancospino
Asked: 2024-05-12 07:18:36 +0800 CST

O que a variável $¢ faz no Raku?

  • 13

A documentação diz que existem apenas 3 variáveis ​​lexicais especiais ( $_, $/, $!).

No entanto, inspecionando o pseudostash MY::, parece que uma variável nomeada $¢também existe e não está documentada (ou pelo menos, pesquisar em docs.raku por $¢ não produz nenhum resultado) (Editar: de acordo com a resposta aceita, isso é realmente falso , está realmente documentado).

say MY::.hash;
# ==> PseudoStash.new((!UNIT_MARKER => (!UNIT_MARKER), $! => Nil, $/ => Nil, $=finish => (Mu), $=pod => [], $?PACKAGE => (GLOBAL), $_ => (Any), $¢ => Nil, &foo => &foo, ::?PACKAGE => (GLOBAL), EXPORT => (EXPORT), GLOBALish => (GLOBAL)))

sub foo {say MY::.hash}
foo();
# ==> PseudoStash.new(($! => Nil, $/ => Nil, $_ => (Any), $¢ => Nil))

$¢=5;
# The compiler doesn't complain, despite $¢ not having been declared

say $¢ 
# ==> 5

Tem $¢algum significado especial?

Se for importante, estou usando o rakudo v2023.12, implementando a v6.d.

raku
  • 1 respostas
  • 298 Views
Martin Hope
Mimosinnet
Asked: 2024-01-07 11:23:07 +0800 CST

É possível usar o índice de um array em um bloco de mapa?

  • 13

Gostaria de usar o índice do array em uma rotina de mapa. Por exemplo, este código Raku:

raku -e 'my @a = "First", "Second", "Third", "First"; say @a.map({ "Index of $_ is: ;" })'

impressões:

(Index of First is: ; Index of Second is: ; Index of Third is: ; Index of First is: ;)

Seria possível obter o índice do array, como:

(Index of First is: 0; Index of Second is: 1; Index of Third is: 2; Index of First is: 3;)

Obrigado!

dictionary
  • 1 respostas
  • 221 Views
Martin Hope
Jan Schultke
Asked: 2024-01-04 08:44:25 +0800 CST

Por que std::println(std::vector) falha ao compilar?

  • 13

Eu tenho o seguinte código:

#include <print>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3};
    std::println("{}", v);
}

Entre os numerosos erros que isso produz, há ( clang++ -std=c++23 -stdlib=libc++, https://godbolt.org/z/3z9Tseh37 ):

[...]/format_arg_store.h:167:17: error: static assertion failed due to [...]
  167 |   static_assert(__arg != __arg_t::__none, "the supplied type is not formattable");
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~

Isso me confunde porque de acordo com a página de suporte do compilador cppreference C++23 , o libc++ suporta std::printlne implementa P2286: Formatting Ranges .

Estou fazendo algo errado ou isso é um bug padrão da biblioteca?

c++
  • 1 respostas
  • 176 Views
Martin Hope
fbrereto
Asked: 2023-12-21 00:31:04 +0800 CST

Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

  • 13

O código a seguir é impresso nullptrem vez de empty( godbolt link ):

#include <iostream>

class empty { };

#if 1
void f(std::nullptr_t) {
    std::cout << "nullptr\n";
}
#endif

void f(empty) {
    std::cout << "empty\n";
}

int main() {
    f({});
}

Desativar a f(nullptr_t)variante faz com emptyque ela seja impressa. Quais são as regras que o C++ está usando para selecionar a nullptr_tvariante sobre a emptyvariante quando ambas estão disponíveis?

c++
  • 1 respostas
  • 215 Views
Martin Hope
God I Hate Python
Asked: 2023-08-27 18:40:35 +0800 CST

std::views::filter do C++20 não filtrando a visualização corretamente

  • 13

Eu estava escrevendo um programa C++ simples que gera uma lista de valores inteiros aleatórios de uma distribuição normal, depois pega os primeiros N itens gerados e os filtra para que seu valor absoluto seja maior que 42. O código que escrevi é o seguinte:

int main() {
//convenience
    namespace rng = std::ranges;
    namespace view = std::views;
//random generation boilerplate
    std::random_device r;
    std::mt19937 gen(r());
    std::normal_distribution<float> taps(-4, 15);
 //the filtering   
    for (const auto& value : view::repeat(0)
        | view::transform([&taps, &gen](auto _) { return std::round(taps(gen)); })
        | view::take(1005)
        | view::filter([](auto val) { return (val < -42 || val > 42); }))
    {
        std::cout << value << ' ';
    }
    return 0;
}

se eu remover a view::filterlinha, a sequência parece perfeitamente normal e há cerca de 3 valores que satisfazem a condição. No entanto, quando o filtro é aplicado, a saída parece ser algum lixo aleatório, como -12 -8 -14 2 -4 -11 -38. Como isso faz algum sentido? Esses números nem sequer satisfazem a condição de filtragem. Qualquer ajuda é apreciada.

notas:
compilado com g++ -o test main.cpp -std=c++2b, tanto no Windows quanto no Linux.
Se eu substituir views::repeat(0) por views::iota(0) e compilar com -std=c++20, a saída será a mesma - algum lixo aleatório.
Além disso, se alguém sugerir a melhor maneira de gerar uma lista a partir do lambda, eu agradeceria muito.

c++
  • 2 respostas
  • 198 Views
Martin Hope
jabaa
Asked: 2023-08-18 07:15:20 +0800 CST

Por que o construtor de uma variável global não é chamado em uma biblioteca?

  • 13

Eu tenho algum código legado com algumas classes singleton que se registram usando construtores de variáveis ​​globais. É uma grande base de código, compilada em um executável. Tentei organizar a base de código e reagrupar o código em bibliotecas. Um exemplo mínimo do código atual é

main.cpp

int main(int argc, char *argv[])
{
  return 0;
} 

Hash.cpp

#include <iostream>

class Hash
{
public:
    Hash()
    {
        std::cout << "Hash\n";
    }
};

Hash a;

e a configuração de compilação atual é

CMakeLists.txt

cmake_minimum_required(VERSION 3.26)
project(mcve)

add_executable(mcve main.cpp Hash.cpp)

Construindo o código e executando as impressões executáveis

Hash

Eu modifiquei a configuração de compilação para

cmake_minimum_required(VERSION 3.26)
project(mcve)

add_library(Hash Hash.cpp)
add_executable(mcve main.cpp)
target_link_libraries(mcve Hash)

Isso cria uma biblioteca estática libHash.ae a vincula ao executável. Compilar o mesmo código e executar o executável não imprime nada. Por que a diferença e onde é descrita? Faz parte do padrão C++ ou do compilador? É específico do sistema operacional (bibliotecas estáticas do Linux)? É um comportamento indefinido?

c++
  • 1 respostas
  • 418 Views
Prev
Próximo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve