Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 1011311
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 16, 20262026-05-16T09:12:53+00:00 2026-05-16T09:12:53+00:00

I have two functions : void foo(const char * p) and template<size_t T_Size> void

  • 0

I have two functions :

void foo(const char * p)

and

template<size_t T_Size>
void foo(const char (& p)[T_Size]) ;

Given the call:

int main(int argc, char* argv[])
{
   char a[21] ;                          // typeid : A21_c
   sprintf(a, "a[21] : Hello World") ;

   const char * b = "b : Hello World" ;  // typeid : PKc

   // note that literal "liter. : Hello World" has a typeid : A21_c

   foo(a) ;                      // calls foo(const char (& p)[T_Size])
   foo(b) ;                      // calls foo(const char * p)
   foo("liter. : Hello World") ; // calls foo(const char * p) ???

   return 0 ;
}

Apparently, calling foo with a stack-based correctly declared array behaves as expected, while calling foo with a literal "liter. : Hello World" does not, despite the two having the same type (according to RTTI).

What are exactly the rules followed by the symbol lookup to choose one overload over the other ?

Why the different behaviour between a declared array and a string literal ?

Thanks !

Edit

Note that a way to have the desired result (i.e. have a litteral string match the foo(const char (& p)[T_Size]) function) is to remove the void foo(const char *p) and add instead:

struct FooIndirect
{
    const char * m_p ;
    FooIndirect(const char *p) : m_p(p) {}
} ;

void foo(const FooIndirect & p)
{
    // do something with p.m_p
}

This indirection makes the templated foo a better match for string litterals, and still enables the user to use pointers (the indirection will be removed in optimized compilation mode).

I tested it on my g++ 4.4.3, but I believe it will work the same way on every compiler.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-16T09:12:54+00:00Added an answer on May 16, 2026 at 9:12 am

    Table 9 in Chapter 13(Overload Resolution) of the Standards, ranks “Array to pointer” conversion (for non-template) to be of the same rank (EXACT MATCH) as “no Conversion Required” (for the template version).

    Everything else being the same, the non-template version is preferred over the template version.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 496k
  • Answers 496k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer The only reason that I know of why a formula… May 16, 2026 at 11:45 am
  • Editorial Team
    Editorial Team added an answer This is to Stop CSRF. The value is a "csrf… May 16, 2026 at 11:45 am
  • Editorial Team
    Editorial Team added an answer You could do it like this: DELETE FROM tbl_1 WHERE… May 16, 2026 at 11:45 am

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Related Questions

I have two ajax functions and use the first one to pass some data
I have a class with two constructors, one that takes no arguments and one
I have a function that processes a given vector, but may also create such
Let's say I have two classes, A and B, where B is a child
I have the following problem. I have two classes, in this case A and
I have some template code that I would prefer to have stored in a
I am writing a GTKmm window program; the main window creates two buttons, one
I have a C++ class, which has the following methods: class Bar { ...
I am using a library that consists almost entirely of templated classes and functions
I have run into a very strange behaviour I can’t make sense of. I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.